Cod sursa(job #2474559)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 15 octombrie 2019 15:31:16
Problema Elimin 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("elimin2.in");
ofstream fout("elimin2.out");

const short alpha = 10;
const short DIM = 2007;

short st[DIM][alpha];
short dr[DIM][alpha];

short dp[DIM][DIM];

void print(short l, short r, short val)
{
	if(l > r)
		return ;
	
	for(short i = alpha - 1; i >= 0; i--)
		if(dp[dr[l][i]][st[r][i]] == val)
		{
			fout << i;
			
			print(dr[l][i] + 1, st[r][i] - 1, val - 2);
			
			if(val >= 2)
				fout << i;
				
			return ;
		}
}

main()
{
	string s;
	fin >> s;
	
	short n = s.size();
	
	s = ' ' + s;
	
	for(short i = 0; i < alpha; i++)
		dr[n + 1][i] = n + 1;
	
	for(short i = 1; i <= n; i++)
	{
		for(short j = 0; j < alpha; j++)
			st[i][j] = st[i - 1][j];
			
		st[i][s[i] - '0'] = i;
	}
	
	for(short i = n; i >= 1; i--)
	{
		for(short j = 0; j < alpha; j++)
			dr[i][j] = dr[i + 1][j];
		
		dr[i][s[i] - '0'] = i;
	}
	
	for(short i = 1; i <= n; i++)
		dp[i][i] = 1;
	
	for(short len = 2; len <= n; len++)
		for(short i = 1; i + len - 1 <= n; i++)
			if(s[i] == s[i + len - 1])
				dp[i][i + len - 1] = dp[i + 1][i + len - 2] + 2;
			else
				dp[i][i + len - 1] = max(dp[i + 1][i + len - 1], dp[i][i + len - 2]);
	
	short res = 0;
	
	for(short i = 1; i < alpha; i++)
		if(dr[1][i] != -1)
			res = max(res, dp[dr[1][i]][st[n][i]]);
	
	print(1, n, res);
}