Cod sursa(job #741874)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 27 aprilie 2012 11:42:32
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#include <string.h>

#define MAXN 2050
#define SIGMA 10

short D[MAXN][MAXN];
char S[MAXN];
short St[MAXN][SIGMA];
short Dr[MAXN][SIGMA];

int i, j, lung;
int N, Ans;

inline int max(const int &a, const int &b)
{
	return (a<b ? b : a);
}

void afis(int st, int dr, short val)
{
	if (val <= 0) return;
	
	for (int i = SIGMA - 1; i >= 0; --i)
		if (D[ Dr[st][i] ][ St[dr][i] ] == val){
			printf("%d",i);
			
			afis(Dr[st][i]+1, St[dr][i] - 1, val-2);
			
			if (val > 1) 
				printf("%d", i);
			
			return;
		}
}

int main()
{
	freopen("elimin2.in","r",stdin);
	freopen("elimin2.out","w",stdout);
	
	fgets(S+1, MAXN, stdin);
	N = strlen(S+1) - 1;
	
	for (i = 1; i <= N; ++i){
		for (j = 0; j < SIGMA; ++j)
			St[i][j] = St[i-1][j];
		St[i][S[i]-'0'] = i;
	}
	
	for (i = N; i >= 1; --i){
		for (j = 0; j < SIGMA; ++j)
			Dr[i][j] = Dr[i+1][j];
		Dr[i][S[i]-'0'] = i;
	}
	
	for (i = 1; i <= N; ++i)
		D[i][i] = 1;
	
	for (lung = 2; lung <= N; ++lung)
		for (i = 1; i + lung - 1  <= N; ++i){
			j = i + lung - 1;
			D[i][j] = max(D[i+1][j], D[i][j-1]);
			if (S[i] == S[j])
				D[i][j] = max(D[i][j], D[i+1][j-1] + 2);
		}
	
	Ans = 0;
	for (i = 1; i < SIGMA; ++i)
		Ans = max(Ans, D[ Dr[1][i] ][ St[N][i] ]);
	
	afis(1, N, Ans);
	
	return 0;
}