Pagini recente » Cod sursa (job #2784628) | Cod sursa (job #3143487) | Cod sursa (job #2436958) | Cod sursa (job #2076165) | Cod sursa (job #2715375)
#include <bits/stdc++.h>
#define NMAX 2005
using namespace std;
ifstream fin("elimin2.in");
ofstream fout("elimin2.out");
short lf[NMAX][10], rg[NMAX][10], dp[NMAX][NMAX];
bool ok = 0;
void recur(short st, short dr, short lg)
{
if(lg <= 0)
return;
for(short cif = 9; cif >= 0; --cif)
if(dp[rg[st][cif]][lf[dr][cif]] == lg)
{
fout << cif;
recur(rg[st][cif] + 1, lf[dr][cif] - 1, lg - 2);
if(lg > 1)
fout << cif;
ok = 1;
return;
}
}
int main()
{
string s;
fin >> s;
short n = s.size();
for(short i = 1; i <= n; ++i)
{
for(short cif = 0; cif <= 9; ++cif)
lf[i][cif] = lf[i - 1][cif];
lf[i][s[i - 1] - '0'] = i;
}
for(short i = n; i >= 1; --i)
{
for(short cif = 0; cif <= 9; ++cif)
rg[i][cif] = rg[i + 1][cif];
rg[i][s[i - 1] - '0'] = i;
}
for(short i = 1; i <= n; ++i)
dp[i][i] = 1;
for(short lg = 2; lg <= n; ++lg)
for(short i = 1; i <= n - lg + 1; ++i)
{
short j = i + lg - 1;
if(s[i - 1] == s[j - 1])
dp[i][j] = dp[i + 1][j - 1] + 2;
else dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
}
short maxx = 0;
for(short cif = 9; cif >= 1; --cif)
maxx = max(maxx, dp[rg[1][cif]][lf[n][cif]]);
recur(1, n, maxx);
if(!ok)
fout << 0 << '\n';
return 0;
}