Cod sursa(job #560705)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 18 martie 2011 17:27:13
Problema Elimin 2 Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#include <string.h>

#define MAXN 2010

short D[MAXN][MAXN];
int i,j,N;
int aux,aux2,maxim, poz1, poz2;
char S[MAXN];
short A[MAXN], B[MAXN];

inline int max(const int &x, const int &y)
{ return (x<y ? y : x); }

int main()
{
	freopen("elimin2.in","r",stdin);
	freopen("elimin2.out","w",stdout);
	
	fgets(S, 2010, stdin);
	N = strlen(S);
	if (S[N-1] < '0') --N;
	for (i=0; i<N; ++i){
		A[i+1] = S[i] - '0';
		B[i+1] = S[N-i-1] - '0';
	}
	
	maxim = 0;
	for (i=1; i<=N; ++i)
		for (j=1; j<=N; ++j){
			aux = max(D[i][j-1], D[i-1][j]);
			if (A[i]==B[j]){
				aux2 = D[i-1][j-1];
				aux2 = (aux2 / 10 + 1) * 10 + A[i];
				aux = max(aux, aux2);
			}
			D[i][j] = aux;
			if (maxim < aux && aux%10!=0){
				maxim = aux;
				poz1 = i;
				poz2 = j;
			}
		}
	
	i = poz1; j = poz2;
	while (i>0 && j>0){
		if (A[i] == B[j]){
			aux = D[i-1][j-1];
			aux = (aux/10+1)*10 + A[i];
			if (aux == D[i][j]){
				printf("%d", A[i]);
				--i;
				--j;
			}
		}
		else{
			if (D[i][j-1] > D[i-1][j]) --j;
			else --i;
		}
	}
	
	printf("\n");
	
	return 0;
}