Cod sursa(job #637262)

Utilizator veleanduAlex Velea veleandu Data 20 noiembrie 2011 13:29:40
Problema PalM Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 1.64 kb
#include<fstream>
#include<iostream>
#include<string.h>
using namespace std;
long i,m,act,j,maxim,l,n;
char T[505];
typedef struct { short L[30]; bool A[30]; } litere;
litere P[505][505];
int main()
{
    ifstream in("palm.in");
    ofstream out("palm.out");
    in>>T;
    n=strlen(T)-1;
    for ( i=0; i<=n; ++i)
    {
        P[i][i].A[T[i]-'a']=1;
        P[i][i].L[T[i]-'a']++;
    }
    for ( i=1; i<=n; ++i)
    {
        // j-ul incepe de la 1 pana la n-i
        for ( j=0; j<=n-i; ++j)
        // pozitia curenta este .. [j][j+i]
        {
            for ( l=0; l<=28; ++l)
            {
                maxim=0;
                if ( P[j][j+i-1].L[l]>maxim)   // - P[j][j+i-1].A[T[j]-'a'
                    maxim=P[j][j+i-1].L[l];
                    if ( P[j+1][j+i-1].L[l]>maxim)
                        maxim=P[j+1][j+i-1].L[l];
                    if ( P[j+1][j+i].L[l]>maxim) // - P[j+1][j+i].A[T[j]-'a']
                        maxim=P[j+1][j+i].L[l];
                P[j][j+i].L[l]=maxim;
            }

            if ( T[j]==T[j+i] )
            // avem confirmare b-)
            {
                maxim=0;
                for ( l=T[j]-'a'; l<=28; ++l)
                {
                    if ( P[j+1][j+i-1].L[l]>maxim)
                        maxim=P[j+1][j+i-1].L[l];
                }
                P[j][j+i].L[T[j]-'a']=maxim+2;
                P[j][j+i].A[T[j]-'a']=1;
            }
        }
    }
    /*for ( i=0; i<=n; ++i,cout<<"\n")
        for ( j=0; j<=n; ++j)
            cout<<P[i][j].L[0]<<" ";*/
    maxim=0;
    for ( i=0; i<=28; ++i)
        if ( P[0][n].L[i]>maxim)
            maxim=P[0][n].L[i];
    out<<maxim;
    return 0;
}