Pagini recente » Cod sursa (job #689792) | Cod sursa (job #910303) | Cod sursa (job #2259706) | Cod sursa (job #1873354) | Cod sursa (job #45207)
Cod sursa(job #45207)
#include <stdio.h>
#include <string>
#include <iostream>
#define nmax 2005
using namespace std;
char ch;
int a[nmax],n,i,c[nmax][nmax];
string r[nmax][nmax];
int stanga[10][nmax],dreapta[10][nmax];
inline int max(int a,int b) {
if(a > b) return a;
else return b;
}
int main() {
freopen("elimin2.in","r",stdin);
freopen("elimin2.out","w",stdout);
while(!feof(stdin)) {
scanf("%c",&ch);
if(ch >= '0' && ch <= '9') a[++n] = (int)(ch - '0');
}
for(int i = 0; i <= n + 1; i++)
for(int j = 0; j <= n + 1; j++) c[i][j] = -10;
for(int cif = 0; cif <= 10; cif++) {
dreapta[cif][0] = 0;
stanga[cif][n + 1] = n + 1;
for(int i = 1; i <= n; i++)
if(a[i] == cif) dreapta[cif][i] = i;
else dreapta[cif][i] = dreapta[cif][i - 1];
for(int i = n; i >= 1; i--)
if(a[i] == cif) stanga[cif][i] = i;
else stanga[cif][i] = stanga[cif][i + 1];
}
for(int l = 1; l <= n; l++)
for(int i = 1; i <= n; i++) {
int st = i;
int fi = i + l - 1;
if(fi > n) break;
if(fi == st) {
c[fi][st] = 1;
r[fi][st] = a[fi] + '0';
}
else {
c[st][fi] = c[st + 1][fi]; r[st][fi] = r[st + 1][fi];
if(c[st][fi - 1] > c[st][fi] || (c[st][fi - 1] == c[st][fi] && r[st][fi - 1] > r[st][fi])) {
c[st][fi] = c[st][fi - 1];
r[st][fi] = r[st][fi - 1];
}
if(dreapta[a[st]][fi] != 0) {
int aux = c[st + 1][dreapta[a[st]][fi] - 1] + 2;
string ax;
ax = a[st] + '0';
ax += r[st + 1][dreapta[a[st]][fi] - 1];
ax += a[st] + '0';
if(aux > c[st][fi] || (aux == c[st][fi] && ax > r[st][fi])) {
c[st][fi] = aux;
r[st][fi] = ax;
}
}
if(stanga[a[fi]][st] != n + 1 ) {
int aux = c[stanga[a[fi]][st] + 1][fi - 1] + 2;
string ax;
ax = a[fi] + '0';
ax += r[stanga[a[fi]][st] + 1][fi - 1];
ax += a[fi] + '0';
if(aux > c[st][fi] || (aux == c[st][fi] && ax > r[st][fi])) {
c[st][fi] = aux;
r[st][fi] = ax;
}
}
}
}
cout << r[1][n] << endl;
return 0;
}