Pagini recente » Cod sursa (job #1549050) | Cod sursa (job #1898930) | Cod sursa (job #1066495) | Cod sursa (job #3137668) | Cod sursa (job #1761595)
#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;
}