Pagini recente » Cod sursa (job #3039960) | Cod sursa (job #480525) | Cod sursa (job #1203180) | Cod sursa (job #916128) | Cod sursa (job #635807)
Cod sursa(job #635807)
#include <cstdio>
#include <iostream>
using namespace std;
#define MAXN 550
#define INF 0x3f3f3f3f
#define NONE -10000
inline int max(int a, int b)
{
return a > b ? a : b;
}
FILE* fin = fopen("palm.in", "r");
FILE* fout = fopen("palm.out", "w");
char a[MAXN];
int len = 0, x[MAXN][MAXN], prev[MAXN][MAXN];
int f(int i, int j)
{
if (x[i][j] == NONE) {
if (i == j) {
x[i][j] = 1;
prev[i][j] = a[i];
} else if (i == j - 1) {
x[i][j] = (a[i] == a[j]) ? 2 : 1;
prev[i][j] = a[i];
} else if (a[i] == a[j]) {
int k = f(i + 1, j - 1);
if (prev[i + 1][j - 1] >= a[i] || !prev[i + 1][j - 1]) {
x[i][j] = k + 2;
prev[i][j] = a[i];
} else {
x[i][j] = 2;
prev[i][j] = a[i];
}
} else {
int a = f(i, j - 1), b = f(i + 1, j);
if (a > b) {
x[i][j] = a;
prev[i][j] = prev[i][j - 1];
} else {
x[i][j] = b;
prev[i][j] = prev[i + 1][j];
}
}
}
return x[i][j];
}
int main()
{
fgets(a, sizeof(a), fin);
while (isalpha(a[len])) {
++len;
}
for (int i = 0; i <= len; ++i) {
for (int j = 0; j <= len; ++j) {
x[i][j] = NONE;
}
}
fprintf (fout, "%d\n", f(0, len - 1));
fclose(fin);
fclose(fout);
return 0;
}