Cod sursa(job #161846)

Utilizator MariusMarius Stroe Marius Data 18 martie 2008 21:13:51
Problema Elimin 2 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <cstring>

using namespace std;

const char iname[] = "elimin2.in";
const char oname[] = "elimin2.out";

#define FOR(i, a, b) for (int i = (a); i <= (b); ++ i)
#define FORR(i, b, a) for (int i = (b); i >= (a); -- i)
#define MAX(a, b) ((a) > (b) ? (a) : (b))

#define MAXN  2002

char A[MAXN];

int L[MAXN][10], R[MAXN][10];

short int C[MAXN][MAXN];

ofstream fout(oname);

void print(int c, int lo, int hi)
{
	fout << c;
	if (hi-lo+1 >= 3) {
		int l, r;

		FORR (j, 9, 0) if ((l = R[lo + 1][j]) && (r = L[hi - 1][j]))
			if (C[l][r] == C[lo][hi] - 2) {
				print(j, l, r);
				break ;
			}
	}
	if (hi-lo+1 >= 2)
		fout << c;
}

int main(void)
{
	ifstream fin(iname); fin >> (A + 1); fin.close();
	
	int n = (int)strlen(A + 1);

	FOR (i, 1, n) FOR (j, 0, 9) {
		if (A[i] == j + '0')
			L[i][j] = i;
		else
			L[i][j] = L[i - 1][j];
	}
	FORR (i, n, 1) FOR (j, 0, 9) {
		if (A[i] == j + '0')
			R[i][j] = i;
		else
			R[i][j] = R[i + 1][j];
	}
	
	FOR (i, 1, n)  C[i][i] = 1;
	FOR (d, 1, n - 1) FOR (i, 1, n - d)
	{
		int j = i + d;
		short int &temp = C[i][j];
		int p;

		temp = MAX(C[i + 1][j], C[i][j - 1]);
		if ((p = L[j][A[i] - '0']) >= i)
			temp = MAX(temp, C[i + 1][p - 1] + 2);
		if ((p = R[i][A[j] - '0']) <= j)
			temp = MAX(temp, C[p + 1][j - 1] + 2);
	}

	int ret = 0, l, r;
	FOR (j, 1, 9) if ((l = R[1][j]) && (r = L[n][j]))
		if (ret < C[l][r])
			ret = C[l][r];

	FORR (j, 9, 1) if ((l = R[1][j]) && (r = L[n][j]))
		if (ret == C[l][r]) {
			print(j, l, r);
			break ;
		}
   
	fout.close();
	return 0;
}