Pagini recente » Cod sursa (job #1648419) | Cod sursa (job #482220) | Cod sursa (job #3156761) | Cod sursa (job #737168) | Cod sursa (job #882205)
Cod sursa(job #882205)
#include<stdio.h>
#include<cstring>
#include<algorithm>
#define maxn 2005
#define sigma 10
using namespace std;
FILE*f=fopen("elimin2.in","r");
FILE*g=fopen("elimin2.out","w");
int n;
char sir[maxn];
short int D[maxn][maxn],toright[sigma][maxn],toleft[sigma][maxn];
void build_sol ( int left , int right , int niv ){
if ( left >= right ){
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];
fprintf(g,"%c",now+'0');
build_sol(next_left,next_right,niv+1);
if ( D[left][right] > 3 ){
fprintf(g,"%c",now+'0');
}
}
int main () {
fscanf(f,"%s",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],(short int)(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,1);
fclose(f);
fclose(g);
return 0;
}