Cod sursa(job #2989799)

Utilizator NarcisMMic Narcis NarcisM Data 7 martie 2023 00:15:10
Problema Elimin 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>
#define maxn 2005
#define sigma 10
using namespace std;
ifstream fin("elimin2.in");
ofstream fout("elimin2.out");
int n, D[maxn][maxn], toright[sigma][maxn], toleft[sigma][maxn];
char sir[maxn];
void build_sol(int left, int right){
	if(left >= right || D[left][right] <= 2)
		return;
	int now = -1, next_left = 0, next_right = 0;
	for(int c = sigma - 1; c >= 0; --c){
		if(toright[c][left + 1] <= n && toleft[c][right - 1] >= 1 && D[toright[c][left + 1]][toleft[c][right - 1]] == D[left][right] - 2){
			now = c;
			break;
		}
	}
	next_left = toright[now][left + 1];
	next_right = toleft[now][right - 1];
	fout << char(now + '0');
	build_sol(next_left, next_right);
	if(D[left][right] > 3)
		fout << char(now + '0');
}
int main(){
    fin >> (sir + 1);
	n = strlen(sir + 1);
	for(int i = 1; i <= n; i++)
        D[i][i] = 1;
	for(int l = 2; l <= n; l++){
		for(int i = 1; i + l - 1 <= n; i++){
			int j = i + l - 1;
			D[i][j] = max(D[i + 1][j], D[i][j - 1]);
			if(sir[i] == sir[j])
				D[i][j] = max(D[i][j], D[i + 1][j - 1] + 2);
		}
	}
	for(int j = 0; j < sigma; j++)
	    toright[j][n + 1] = n + 1;
	for(int i = n; i >= 0; i--){
		for(int j = 0; j < sigma; j++)
			toright[j][i] = toright[j][i + 1];
		toright[sir[i] - '0'][i] = i;
	}
	for(int i = 1; i <= n; i++){
		for(int j = 0; j < sigma; j++)
			toleft[j][i] = toleft[j][i - 1];
		toleft[sir[i] - '0'][i] = i;
	}
	for(int c = 1; c <= 9; c++)
		D[0][n + 1] = max(D[0][n + 1], D[toright[c][1]][toleft[c][n]]);
	D[0][n + 1] += 2;
	build_sol(0, n + 1);
	return 0;
}