Cod sursa(job #45207)

Utilizator alextheroTandrau Alexandru alexthero Data 1 aprilie 2007 11:14:57
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <stdio.h>
#include <string>
#include <iostream>

#define nmax 2005

using namespace std;

char ch;
int a[nmax],n,i,c[nmax][nmax];
string r[nmax][nmax];
int stanga[10][nmax],dreapta[10][nmax];

inline int max(int a,int b) {
	if(a > b) return a;
	else return b;
}

int main() {
	freopen("elimin2.in","r",stdin);
	freopen("elimin2.out","w",stdout);

	while(!feof(stdin)) {
		scanf("%c",&ch);
		if(ch >= '0' && ch <= '9') a[++n] = (int)(ch - '0');
	}

	for(int i = 0; i <= n + 1; i++) 
		for(int j = 0; j <= n + 1; j++) c[i][j] = -10;
	
	for(int cif = 0; cif <= 10; cif++) {
		dreapta[cif][0] = 0;
		stanga[cif][n + 1] = n + 1;
		for(int i = 1; i <= n; i++) 
			if(a[i] == cif) dreapta[cif][i] = i;
			else dreapta[cif][i] = dreapta[cif][i - 1];
		for(int i = n; i >= 1; i--) 
			if(a[i] == cif) stanga[cif][i] = i;
			else stanga[cif][i] = stanga[cif][i + 1];
	}

	for(int l = 1; l <= n; l++) 
		for(int i = 1; i <= n; i++) {
			int st = i;
			int fi = i + l - 1;
			if(fi > n) break;
			if(fi == st) {
				c[fi][st] = 1;
				r[fi][st] = a[fi] + '0';
			}
			else {
				c[st][fi] = c[st + 1][fi]; r[st][fi] = r[st + 1][fi];
				if(c[st][fi - 1] > c[st][fi] || (c[st][fi - 1] == c[st][fi] && r[st][fi - 1] > r[st][fi])) {
					c[st][fi] = c[st][fi - 1];
					r[st][fi] = r[st][fi - 1];
				}
				if(dreapta[a[st]][fi] != 0) {
					int aux = c[st + 1][dreapta[a[st]][fi] - 1] + 2;
					string ax;
					ax = a[st] + '0';
					ax += r[st + 1][dreapta[a[st]][fi] - 1];
					ax += a[st] + '0';
					if(aux > c[st][fi] || (aux == c[st][fi] && ax > r[st][fi])) {
						c[st][fi] = aux;
						r[st][fi] = ax;
					}
				}
				if(stanga[a[fi]][st] != n + 1 ) {
					int aux = c[stanga[a[fi]][st] + 1][fi - 1] + 2;
					string ax;
					ax = a[fi] + '0';
					ax += r[stanga[a[fi]][st] + 1][fi - 1];
					ax += a[fi] + '0';
					if(aux > c[st][fi] || (aux == c[st][fi] && ax > r[st][fi])) {
						c[st][fi] = aux;
						r[st][fi] = ax;
					}
				}
			}
		}

	cout << r[1][n] << endl;
	
	return 0;
}