Cod sursa(job #1474623)

Utilizator enedumitruene dumitru enedumitru Data 22 august 2015 14:38:36
Problema PalM Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("palm.in"); ofstream g("palm.out");
int a[505][505][27];// a[i][j][k]=cel mai lg subsir x care se include in secventa i..j si are ultimul termen >=k
int main(void)
{   int n,i,j,k,x[5050]; char s[505];
    f>>s;
    // initializari
    n=strlen(s);
    for(i=1;i<=n;++i) x[i]=int(s[i-1])-96;
    for(i=1;i<=n;++i)
        for(k=x[i];k;--k) a[i][i][k]=1;
    for(i=1;i<n;++i)
        if(x[i]==x[i+1]) for(k=x[i];k;--k) a[i][i+1][k]=2;
        else for(k=max(x[i],x[i+1]);k;--k) a[i][i+1][k]=1;
    // fac dinamica
    for (int lg=3;lg<=n;++lg)
        for(i=1;i<=n-lg+1;++i)
        {   int p=i, u=i+lg-1;
            for(k=26;k;--k)
              if(k==x[p]&&k==x[u]) a[p][u][k]=a[p+1][u-1][k]+2;
               else a[p][u][k]=max(a[p+1][u-1][k],max(a[p][u-1][k],a[p+1][u][k]));
            for (k=25;k;--k) a[p][u][k]=max(a[p][u][k],a[p][u][k+1]);
        }
    g<<a[1][n][1]<<'\n'; g.close(); return(0);
}