Pagini recente » Cod sursa (job #3258543) | Cod sursa (job #1856344) | Cod sursa (job #892285) | Cod sursa (job #2902486) | Cod sursa (job #2989799)
#include <bits/stdc++.h>
#define maxn 2005
#define sigma 10
using namespace std;
ifstream fin("elimin2.in");
ofstream fout("elimin2.out");
int n, D[maxn][maxn], toright[sigma][maxn], toleft[sigma][maxn];
char sir[maxn];
void build_sol(int left, int right){
if(left >= right || D[left][right] <= 2)
return;
int now = -1, next_left = 0, next_right = 0;
for(int c = sigma - 1; c >= 0; --c){
if(toright[c][left + 1] <= n && toleft[c][right - 1] >= 1 && D[toright[c][left + 1]][toleft[c][right - 1]] == D[left][right] - 2){
now = c;
break;
}
}
next_left = toright[now][left + 1];
next_right = toleft[now][right - 1];
fout << char(now + '0');
build_sol(next_left, next_right);
if(D[left][right] > 3)
fout << char(now + '0');
}
int main(){
fin >> (sir + 1);
n = strlen(sir + 1);
for(int i = 1; i <= n; i++)
D[i][i] = 1;
for(int l = 2; l <= n; l++){
for(int i = 1; i + l - 1 <= n; i++){
int j = i + l - 1;
D[i][j] = max(D[i + 1][j], D[i][j - 1]);
if(sir[i] == sir[j])
D[i][j] = max(D[i][j], D[i + 1][j - 1] + 2);
}
}
for(int j = 0; j < sigma; j++)
toright[j][n + 1] = n + 1;
for(int i = n; i >= 0; i--){
for(int j = 0; j < sigma; j++)
toright[j][i] = toright[j][i + 1];
toright[sir[i] - '0'][i] = i;
}
for(int i = 1; i <= n; i++){
for(int j = 0; j < sigma; j++)
toleft[j][i] = toleft[j][i - 1];
toleft[sir[i] - '0'][i] = i;
}
for(int c = 1; c <= 9; c++)
D[0][n + 1] = max(D[0][n + 1], D[toright[c][1]][toleft[c][n]]);
D[0][n + 1] += 2;
build_sol(0, n + 1);
return 0;
}