Pagini recente » Cod sursa (job #1480461) | Cod sursa (job #2579158) | Cod sursa (job #1877268) | Cod sursa (job #2147665) | Cod sursa (job #1731169)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("elimin2.in");
ofstream fout("elimin2.out");
const int MAX = 2016;
short D[MAX][MAX];
int N;
char a[MAX];
short st[10][MAX];
short dr[10][MAX];
short L;
void Write( int s, int d, int L );
int main()
{
int i, j, l;
fin.getline(a + 1, MAX);
N = strlen(a + 1);
for ( i = 1; i <= N; i++ )
D[i][i] = 1;
for ( l = 2; l <= N; l++ )
for ( i = 1; i <= N - l + 1; i++ )
{
j = i + l - 1;
D[i][j] = max( D[i + 1][j], D[i][j + 1] );
if ( a[i] == a[j] )
D[i][j] = max( (int)D[i][j], D[i + 1][j - 1] + 2 );
}
for ( i = 0; i <= 9; i++ )
{
for ( j = 1; j <= N; j++ )
{
if ( a[j] - '0' == i )
st[i][j] = j;
else
st[i][j] = st[i][j - 1];
}
dr[i][N + 1] = N + 1;
for ( j = N; j >= 1; j-- )
{
if ( a[j] - '0' == i )
dr[i][j] = j;
else
dr[i][j] = dr[i][j + 1];
}
}
/* for ( i = 1; i <= N; i++ )
{
for ( j = 1; j <= N; j++ )
fout << D[i][j] << ' ';
fout << '\n';
}
// return 0; */
L = 1;
for ( i = 1; i <= 9; i++ )
L = max( L, D[dr[i][1]][st[i][N]] );
Write(1, N, L);
fin.close();
fout.close();
return 0;
}
void Write( int s, int d, int L )
{
int i;
if ( L <= 0 ) return;
// if ( L == 6 )
// fout << "DA";
for ( i = 9; i >= 0; i-- )
{
if ( D[dr[i][s]][st[i][d]] != L )
continue;
fout << i;
Write( dr[i][s] + 1, st[i][d] - 1, L - 2 );
if ( L > 1 )
fout << i;
return;
}
}