Cod sursa(job #1761595)

Utilizator lflorin29Florin Laiu lflorin29 Data 22 septembrie 2016 16:33:49
Problema PalM Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <bits/stdc++.h>

using namespace std;

char s[502];
int memo[502][502][26];

int dp(int i, int j, int k) {
	if(memo[i][j][k] != -1) {
		return memo[i][j][k];
	}

	if(i > j) {
		return 0;
	}

	if(i == j) {
		return s[i] >= k;
	}

	bool ok1 = s[i] < k, ok2 = s[j] < k;
	if(ok1 || ok2) return memo[i][j][k] = dp(i + ok1, j - ok2, k);

	if(s[i] == s[j]) {
	   memo[i][j][k] = 2 + dp(i + 1, j - 1, max(k, max((int)s[i], (int)s[j])));
	}

	memo[i][j][k] = max(memo[i][j][k], max(dp(i + 1, j, k), dp(i, j - 1, k)));
	return memo[i][j][k];
}

int main() {
	ifstream fin("palm.in");
	ofstream fout("palm.out");

	fin >> s;

	int n = strlen(s);
	for(int i = 0; i < n; ++i)
		s[i] -= 'a';

	memset(memo, -1, sizeof memo);
	fout << dp(0, n - 1, 0);
	return 0;
}