Pagini recente » Cod sursa (job #23470) | Borderou de evaluare (job #1323181) | Cod sursa (job #1564288)
#include <stdio.h>
#define MAXN 500
#define INF 2000000000
#define CHARS 26
char s[MAXN + 2];
int d[MAXN][MAXN][CHARS];
int main(){
FILE *in = fopen("palm.in", "r");
int n = 0;
fgets(s, MAXN + 2, in);
while(s[n] >= 'a' && s[n] <= 'z'){
s[n] -= 'a';
n++;
}
fclose(in);
int i, j, k, l, m1, m2;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
for(k = 0; k < CHARS; k++)
d[i][j][k] = -INF;
for(i = 0; i < n; i++)
d[i][i][s[i]] = 1;
for(i = 1; i < n; i++)
d[i][i - 1][CHARS - 1] = 0;
for(i = 2; i <= n; i++){
for(j = 0; j + i <= n; j++){
k = j + i - 1;
if(s[j] == s[k]){
for(l = s[j]; l < CHARS; l++){
if(d[j][k][s[j]] < 2 + d[j + 1][k - 1][l])
d[j][k][s[j]] = 2 + d[j + 1][k - 1][l];
}
}
m1 = m2 = -INF;
for(l = CHARS - 1; l >= 0; l--){
if(d[j + 1][k][l] > m1)
m1 = d[j + 1][k][l];
if(d[j][k - 1][l] > m2)
m2 = d[j][k - 1][l];
if(d[j][k][l] < m1)
d[j][k][l] = m1;
if(d[j][k][l] < m2)
d[j][k][l] = m2;
}
}
}
FILE *out = fopen("palm.out", "w");
int max = 0;
for(i = 0; i < CHARS; i++)
if(max < d[0][n - 1][i])
max = d[0][n - 1][i];
fprintf(out, "%d", max);
fclose(out);
return 0;
}