Cod sursa(job #882205)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 18 februarie 2013 22:28:25
Problema Elimin 2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#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;
}