Pagini recente » Cod sursa (job #1069614) | Cod sursa (job #2820198) | tema | Cod sursa (job #2854390) | Cod sursa (job #1761590)
#include <bits/stdc++.h>
using namespace std;
string s;
int memo[500][500][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;
for(int i = 0; i < s.size(); ++i)
s[i] -= 'a';
memset(memo, -1, sizeof memo);
fout << dp(0, s.size() - 1, 0);
return 0;
}