Cod sursa(job #1564288)

Utilizator hrazvanHarsan Razvan hrazvan Data 9 ianuarie 2016 16:51:34
Problema PalM Scor 80
Compilator c Status done
Runda Arhiva de probleme Marime 1.33 kb
#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;
}