Pagini recente » Cod sursa (job #1396011) | Cod sursa (job #2408286) | Cod sursa (job #2069016) | Cod sursa (job #1437787) | Cod sursa (job #478791)
Cod sursa(job #478791)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const char iname[]="elimin2.in";
const char oname[]="elimin2.out";
const int maxn=2100;
char s[maxn];
int n,i,next[10][maxn],last[10][maxn],rez[maxn],maxt,j,k;
short dp[maxn][maxn];
int main()
{
freopen(iname,"r",stdin);
freopen(oname,"w",stdout);
fgets(s+1,sizeof(s),stdin);
for(n=1;s[n]&&s[n]!='\n';++n)
s[n]-='0';
--n;
for(i=1;i<=n;++i)
dp[i][i]=1;
for(i=1;i<n;++i)
for(j=n-i;j;--j)
{
dp[j][j+i]=max(dp[j][j+i-1],dp[j+1][j+i]);
if(s[i+j]==s[j])
dp[j][j+i]=max(dp[j][j+i],(short int)(dp[j+1][j+i-1]+2));
}
for(i=n;i;--i)
{
for(j=0;j<10;++j)
next[j][i]=next[j][i+1];
next[s[i]][i]=i;
}
for(i=1;i<=n;++i)
{
for(j=0;j<10;++j)
last[j][i]=last[j][i-1];
last[s[i]][i]=i;
}
i=1;j=n;
do
{
maxt=(rez[0]==0);
for(k=1;k<10;++k)
if(dp[next[k][i]][last[k][j]]>=dp[next[maxt][i]][last[maxt][j]])
maxt=k;
if(dp[next[maxt][i]][last[maxt][j]]==0)
break;
rez[rez[0]+1]=rez[rez[0]+dp[next[maxt][i]][last[maxt][j]]]=maxt;
++rez[0];
i=next[maxt][i]+1;
j=last[maxt][j]-1;
}while(1);
rez[0]*=2;
if(rez[rez[0]]==0)
--rez[0];
for(i=1;i<=rez[0];++i)
printf("%d",rez[i]);
printf("\n");
}