Pagini recente » Cod sursa (job #1573340) | Monitorul de evaluare | Cod sursa (job #443379) | Cod sursa (job #1865944) | Cod sursa (job #161846)
Cod sursa(job #161846)
#include <fstream>
#include <cstring>
using namespace std;
const char iname[] = "elimin2.in";
const char oname[] = "elimin2.out";
#define FOR(i, a, b) for (int i = (a); i <= (b); ++ i)
#define FORR(i, b, a) for (int i = (b); i >= (a); -- i)
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MAXN 2002
char A[MAXN];
int L[MAXN][10], R[MAXN][10];
short int C[MAXN][MAXN];
ofstream fout(oname);
void print(int c, int lo, int hi)
{
fout << c;
if (hi-lo+1 >= 3) {
int l, r;
FORR (j, 9, 0) if ((l = R[lo + 1][j]) && (r = L[hi - 1][j]))
if (C[l][r] == C[lo][hi] - 2) {
print(j, l, r);
break ;
}
}
if (hi-lo+1 >= 2)
fout << c;
}
int main(void)
{
ifstream fin(iname); fin >> (A + 1); fin.close();
int n = (int)strlen(A + 1);
FOR (i, 1, n) FOR (j, 0, 9) {
if (A[i] == j + '0')
L[i][j] = i;
else
L[i][j] = L[i - 1][j];
}
FORR (i, n, 1) FOR (j, 0, 9) {
if (A[i] == j + '0')
R[i][j] = i;
else
R[i][j] = R[i + 1][j];
}
FOR (i, 1, n) C[i][i] = 1;
FOR (d, 1, n - 1) FOR (i, 1, n - d)
{
int j = i + d;
short int &temp = C[i][j];
int p;
temp = MAX(C[i + 1][j], C[i][j - 1]);
if ((p = L[j][A[i] - '0']) >= i)
temp = MAX(temp, C[i + 1][p - 1] + 2);
if ((p = R[i][A[j] - '0']) <= j)
temp = MAX(temp, C[p + 1][j - 1] + 2);
}
int ret = 0, l, r;
FOR (j, 1, 9) if ((l = R[1][j]) && (r = L[n][j]))
if (ret < C[l][r])
ret = C[l][r];
FORR (j, 9, 1) if ((l = R[1][j]) && (r = L[n][j]))
if (ret == C[l][r]) {
print(j, l, r);
break ;
}
fout.close();
return 0;
}