Pagini recente » Cod sursa (job #2213965) | Cod sursa (job #641430) | Cod sursa (job #2305124) | Cod sursa (job #1478360) | Cod sursa (job #640075)
Cod sursa(job #640075)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define dr (st+d)
#define ALPH ('z'-'a')
using namespace std;
const int N = 505;
const int K = 27;
int n;
int v[N][N][K];
char c[N];
inline int alph(char x) {
return x - 'a';
}
inline int mx(int a, int b) {
return (a<b ? b:a);
}
inline int mx(int a, int b, int c) {
b = mx(b, c);
return mx(a, b);
}
void PrepareMatrix() {
for (int i = 1; i <= n; ++i)
v[i][i][c[i]-'a'] = 1;
}
inline int GetResult() {
int res = v[1][n][0];
for (int i = 1; i <= ALPH; ++i)
res = mx(res, v[1][n][i]);
return res;
}
int Solve()
{
PrepareMatrix();
for (int d = 1; d < n; ++d) //Distanta dintre st si dr
for (int st = 1; st + d <= n; ++st)
{
for (int k = 0; k <= ALPH; ++k)
{
int a = v[st+1][dr-1][k];
int b = v[st+1][dr][k];
int c = v[st][dr+1][k];
v[st][dr][k] = mx(a, b, c);
}
if (c[st] == c[dr])
for (int k = alph(c[st]); k <= ALPH; ++k)
v[st][dr][alph(c[st])] = mx(v[st][dr][alph(c[st])], v[st+1][dr-1][k] + 2);
}
return GetResult();
}
int main()
{
freopen("palm.in", "r", stdin);
freopen("palm.out", "w", stdout);
gets(c+1);
n = strlen(c+1);
int res = Solve();
printf("%d\n", res);
return 0;
}