Pagini recente » Cod sursa (job #2584632) | Cod sursa (job #1097280) | Cod sursa (job #2143932) | Cod sursa (job #862760) | Cod sursa (job #992396)
Cod sursa(job #992396)
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
short i,j,n,maxi,dp[2013][2013],fi[2013][10],la[2013][10];
char sir[2013];
vector < int > v;
vector < int > :: iterator it;
void write(short i,short j,short l)
{
if(l==1)
{
printf("%c",sir[i]);
return ;
}
v.push_back(sir[i]);
printf("%c",sir[i]);
if(l==2) return ;
int cif;
for(cif=9;cif>=0;cif--)
if(dp[fi[i+1][cif]][la[j-1][cif]]+2==l)
{
write(fi[i+1][cif],la[j-1][cif],l-2);
return ;
}
}
int main()
{
freopen("elimin2.in","r",stdin);
freopen("elimin2.out","w",stdout);
gets(sir+1);
n=strlen(sir+1);
for(i=n;i>=1;i--)
for(j=0;j<10;j++)
{
if(j+48==sir[i]) fi[i][j]=i;
else fi[i][j]=fi[i+1][j];
}
for(i=1;i<=n;i++)
for(j=0;j<10;j++)
{
if(j+48==sir[i]) la[i][j]=i;
else la[i][j]=la[i-1][j];
}
dp[n][n]=1;
for(i=n-1;i>=1;i--)
{
dp[i][i]=1;
dp[i][i+1]=1;
if(sir[i]==sir[i+1]) dp[i][i+1]++;
for(j=i+2;j<=n;j++)
{
dp[i][j]=dp[i+1][j];
if(dp[i][j-1]>dp[i][j]) dp[i][j]=dp[i][j-1];
if(sir[i]==sir[j]) dp[i][j]=dp[i+1][j-1]+2;
}
}
for(i=9;i>=1;i--)
if(dp[fi[1][i]][la[n][i]]>maxi) maxi=dp[fi[1][i]][la[n][i]];
for(i=9;i>=1;i--)
if(dp[fi[1][i]][la[n][i]]==maxi) break;
write(fi[1][i],la[n][i],maxi);
reverse(v.begin(),v.end());
for(it=v.begin();it!=v.end();it++)
printf("%c",*it);
return 0;
}