Cod sursa(job #930487)

Utilizator crushackPopescu Silviu crushack Data 27 martie 2013 17:57:05
Problema Elimin 2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#include <string.h>
#define NMax 2010

const char IN[]="elimin2.in",OUT[]="elimin2.out";

int N;
int T[NMax][NMax],D[NMax][NMax],P[NMax][NMax];
char s[NMax];
bool first;

void write(int x,int y){

	if (x>y) return;
	if (x==y){
		printf("%c",s[x]);
		return;
	}

	int nx=x,ny=y;
	if (P[x][y]==1) ++nx,--ny;
	else if (P[x][y]==2) ++nx;
	else --ny;

	bool b=first;
	if (T[x][y]>T[nx][ny] && (b || s[x]!='0'))
		printf("%c",s[x]),first=true;

	write(nx,ny);

	if (T[x][y]>T[nx][ny] && (b || s[x]!='0'))
		printf("%c",s[x]);
}

int main()
{
	int i,j,k;
	freopen(IN,"r",stdin);
	scanf("%s",s+1);
	fclose(stdin);

	N=strlen(s+1);

	for (i=1;i<=N;++i) T[i][i]=1,D[i][i]=s[i]-'0';

	for (k=2;k<=N;++k)
		for (i=1;i+k-1<=N;++i){
			j=i+k-1;
			if (s[i]==s[j]) T[i][j]=T[i+1][j-1]+2,D[i][j]=s[i]-'0',P[i][j]=1;

			if (T[i+1][j]>T[i][j] || T[i+1][j]==T[i][j] && D[i+1][j]>D[i][j])
				T[i][j]=T[i+1][j],D[i][j]=D[i+1][j],P[i][j]=2;

			if (T[i][j-1]>T[i][j] || T[i][j-1]==T[i][j] && D[i][j-1]>D[i][j])
				T[i][j]=T[i][j-1],D[i][j]=D[i][j-1],P[i][j]=3;
		}
	freopen(OUT,"w",stdout);
	write(1,N);printf("\n");
	fclose(stdout);
	return 0;
}