Pagini recente » Cod sursa (job #3237102) | Cod sursa (job #2114119) | Cod sursa (job #2663479) | Cod sursa (job #553730) | Cod sursa (job #1549832)
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 2000 + 10;
int n , N , st , dr;
char sir[Nmax] , ans[Nmax];
short int L[Nmax][10] , R[Nmax][10];
short int dp[Nmax][Nmax];
void makeDp()
{
for (int i = 1; i <= n; ++i) dp[i][i] = 1;
for (int dim = 2; dim <= n; ++dim)
for (int i = 1; i <= n - dim + 1; ++i)
dp[i][i+dim-1] = max(short(dp[i+1][i+dim-2] + 2 * (sir[i] == sir[i+dim-1])), max(dp[i+1][i+dim-1] , dp[i][i+dim-2]));
}
void siebentauSendzweihundertvierundfunfzig()
{
int i , j;
for (i = 1; i <= n; ++i)
{
for (j = 0; j <= 9; ++j) L[i][j] = L[i-1][j];
L[i][sir[i]-'0'] = i;
}
for (i = n; i ; --i)
{
for (j = 0; j <= 9; ++j) R[i][j] = R[i+1][j];
R[i][sir[i]-'0'] = i;
}
}
void puslo(int crtL , int crtR , int first)
{
if (crtR - crtL <= 1) return;
if (crtL + 2 == crtR) {ans[st] = sir[crtL+1]; return;}
short int maxx = 0;
for (int cf = 9; cf >= first; --cf)
maxx = max(maxx , dp[R[crtL+1][cf]][L[crtR-1][cf]]);
for (int cf = 9; cf >= first; --cf)
if (dp[R[crtL+1][cf]][L[crtR-1][cf]] == maxx)
{
if (first) N = maxx, st = 0, dr = N-1;
ans[st++] = ans[dr--] = cf + '0';
puslo(R[crtL+1][cf] , L[crtR-1][cf] , 0);
break;
}
}
int main()
{
freopen("elimin2.in","r",stdin);
freopen("elimin2.out","w",stdout);
gets(sir+1); n = strlen(sir+1);
makeDp();
siebentauSendzweihundertvierundfunfzig();
puslo(0 , n + 1 , 1);
puts(ans);
return 0;
}