Pagini recente » Cod sursa (job #3130446) | Cod sursa (job #2237735) | Cod sursa (job #2455108) | Rezultate Algorel | Cod sursa (job #638508)
Cod sursa(job #638508)
# include <cstdio>
# include <cstring>
const char *FIN = "palm.in", *FOU = "palm.out";
const int MAX_N = 505, MAX_K = 30;
char S[MAX_N];
int N, dp[MAX_N][MAX_N][MAX_K];
bool viz[MAX_N][MAX_N];
inline int c (char ch) {
return ch - 'a';
}
inline int max (int a, int b) {
return a > b ? a : b;
}
inline void getmax (int &a, int b) {
a = a > b ? a : b;
}
void doit (int x, int y) {
if (viz[x][y] || x > y) return ;
viz[x][y] = 1;
if (x == y) {
dp[x][y][c(S[x])] = 1;
for (int ch = 'z' - 1; ch >= 'a'; --ch)
getmax (dp[x][y][c(ch)], dp[x][y][c(ch) + 1]);
return ;
}
if (S[x] == S[y]) {
doit (x + 1, y - 1);
dp[x][y][c(S[x])] = dp[x + 1][y - 1][c(S[x])] + 2;
for (int ch = 'z' - 1; ch >= 'a'; --ch)
getmax (dp[x][y][c(ch)], dp[x][y][c(ch) + 1]);
return ;
}
doit (x, y - 1), doit (x + 1, y);
for (int ch = 'z'; ch >= 'a'; --ch)
dp[x][y][c(ch)] = max (dp[x + 1][y][c(ch)], dp[x][y - 1][c(ch)]);
for (int ch = 'z' - 1; ch >= 'a'; --ch)
getmax (dp[x][y][c(ch)], dp[x][y][c(ch) + 1]);
}
int main (void) {
fscanf (fopen (FIN, "r"), "%s", S);
N = strlen (S);
doit (0, N - 1);
fprintf (fopen (FOU, "w"), "%d", dp[0][N - 1][0]);
}