Pagini recente » Cod sursa (job #1402528) | Cod sursa (job #314565) | Cod sursa (job #1096430) | Cod sursa (job #1568798) | Cod sursa (job #635935)
Cod sursa(job #635935)
#include <cstdio>
#include <bitset>
#include <iostream>
using namespace std;
#define MAXN 550
#define INF 0x3f3f3f3f
#define NONE -10000
#define SIGMA ('z' - 'a')
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][SIGMA];
bitset<MAXN> comp[MAXN];
void f(int i, int j)
{
if (comp[i][j] || i > j)
return;
//cout << i << " " << j << ": ";
comp[i][j] = true;
if (i == j) {
// cout << "a" << endl;
for (int k = 0; k <= SIGMA; ++k) {
x[i][j][k] = 0;
}
x[i][j][a[i] - 'a'] = 1;
return;
}
if (a[i] == a[j]) {
// cout << "b" << endl;
f(i + 1, j - 1);
for (int k = 0; k <= SIGMA; ++k) {
x[i][j][k] = x[i + 1][j - 1][k];
}
for (int k = a[i] - 'a' + 1; k <= SIGMA; ++k) {
x[i][j][a[i] - 'a'] = max(x[i][j][a[i] - 'a'], x[i + 1][j - 1][k] + 2);
}
return;
}
//cout << "c" << endl;
f(i, j - 1);
f(i + 1, j);
for (int k = 0; k <= SIGMA; ++k) {
x[i][j][k] = max(x[i][j][k], max(x[i + 1][j][k], x[i][j - 1][k]));
}
}
int main()
{
fgets(a, sizeof(a), fin);
while (isalpha(a[len])) {
++len;
}
for (int i = 0; i <= len; ++i) {
for (int j = i; j <= len; ++j) {
for (int k = 0; k <= SIGMA; ++k) {
x[i][j][k] = NONE;
}
}
}
f(0, len - 1);
int mv = 0;
for (int i = 0; i <= SIGMA; ++i) {
mv = max(mv, x[0][len - 1][i]);
}
/*
for (int i = 0; i < len; ++i) {
for (int j = 0; j < len; ++j) {
cout << i << " " << j << ":";
cout << 'a' << " " << x[i][j]['a' - 'a'] << " " << 'b' << " " << x[i][j]['b' - 'a'] << " " << 'x' << " " << x[i][j]['x' - 'a'];
cout << endl;
}
cout << endl;
}
system("pause");*/
fprintf (fout, "%d\n", mv);
fclose(fin);
fclose(fout);
return 0;
}