Cod sursa(job #1761620)

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

using namespace std;

string s;
int dp[502][502][27];

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

	fin >> s;


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

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

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

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

		for(int l = 2; l <= s.size(); ++l) {
		   for(int i = 0; i + l - 1 < s.size(); ++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]});
		   }
		}
	}

	fout << dp[0][s.size() - 1][0];
	return 0;
}