Pagini recente » Cod sursa (job #1823340) | Cod sursa (job #1602158) | Cod sursa (job #2989814) | Cod sursa (job #35484) | Cod sursa (job #640080)
Cod sursa(job #640080)
#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;
}
int Solve()
{
PrepareMatrix();
int res = 0;
for (int d = 1; d < n; ++d) //Distanta dintre st si dr
for (int st = 1; st + d <= n; ++st)
{
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);
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(v[st][dr][k], mx(a, b, c));
res = mx(res, v[st][dr][k]);
}
}
return res;
}
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;
}