Cod sursa(job #1004814)

Utilizator sleepaholicNeculaescu Theodor sleepaholic Data 3 octombrie 2013 18:02:15
Problema PalM Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<fstream>
#include<string>
using namespace std;
int i,j,n,k,a[505][505][27],sir[505];
string s;

int main(void){
    ifstream fin("palm.in");
    ofstream fout("palm.out");
    getline(fin,s);
    // initializez
     n=s.length();
    for (i=1; i<=n; ++i) sir[i]=int(s[i-1])-96;
    for (i=1; i<=n; ++i)
     for (k=sir[i]; k>=1; --k) a[i][i][k]=1;
    for (i=1; i<n; ++i)
     if (sir[i]==sir[i+1])
      for (k=sir[i]; k>=1; --k) a[i][i+1][k]=2;
     else for (k=max(sir[i],sir[i+1]); k>=1; --k) a[i][i+1][k]=1;
    // fac dinamica a[i][j][k]=cel mai lung subsir care se include in secventa i..j
    // si are ultimul termen >=k
    for (int lung=3; lung<=n; ++lung)
        for (i=1; i<=n-lung+1; ++i){
            int p1=i, p2=i+lung-1;
            for (k=26; k>=1; --k)
              if (k==sir[p1]&&k==sir[p2]) a[p1][p2][k]=a[p1+1][p2-1][k]+2;
               else a[p1][p2][k]=max(a[p1+1][p2-1][k],max(a[p1][p2-1][k],a[p1+1][p2][k]));
            for (k=25; k>=1; --k) a[p1][p2][k]=max(a[p1][p2][k],a[p1][p2][k+1]);
            }
    // solutia evident se afla in a[1][n][1]
    fout<<a[1][n][1];
 return(0);
}