Cod sursa(job #1761623)

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

using namespace std;

char s[502];
int n;
int dp[502][502][27];

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

	scanf("%s", s);
	n = strlen(s);


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

	for(int c = 25; c >= 0; --c) {

		for(int i = 0; i < n; ++i)
		   if(s[i] == c)
		     dp[i][i][c] = 1;

		if(c != 25) {
		for(int i = 0; i < n; ++i)
			for(int j = i; j < n; ++j)
			   dp[i][j][c] = max(dp[i][j][c], dp[i][j][c + 1]);
		}

		for(int l = 2; l <= n; ++l) {
		   for(int i = 0; i + l - 1 < n; ++i) {
			  int j = i + l - 1;
			  bool ok1 = s[i] < c, ok2 = s[i] < c;
			  if(ok1 || ok2) {
				 dp[i][j][c] = dp[i + ok1][j - ok2][c];
			  }

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

			  dp[i][j][c] = max({dp[i][j][c], dp[i + 1][j][c],  dp[i][j - 1][c]});
		   }
		}
	}

	printf("%d", dp[0][n - 1][0]);
	return 0;
}