Cod sursa(job #478791)

Utilizator freak93Adrian Budau freak93 Data 20 august 2010 13:42:29
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const char iname[]="elimin2.in";
const char oname[]="elimin2.out";
const int maxn=2100;

char s[maxn];

int n,i,next[10][maxn],last[10][maxn],rez[maxn],maxt,j,k;
short dp[maxn][maxn];

int main()
{
    freopen(iname,"r",stdin);
    freopen(oname,"w",stdout);
    fgets(s+1,sizeof(s),stdin);
    for(n=1;s[n]&&s[n]!='\n';++n)
        s[n]-='0';
    --n;
    for(i=1;i<=n;++i)
        dp[i][i]=1;
    for(i=1;i<n;++i)
        for(j=n-i;j;--j)
        {
            dp[j][j+i]=max(dp[j][j+i-1],dp[j+1][j+i]);
            if(s[i+j]==s[j])
                dp[j][j+i]=max(dp[j][j+i],(short int)(dp[j+1][j+i-1]+2));
        }
    for(i=n;i;--i)
    {
        for(j=0;j<10;++j)
            next[j][i]=next[j][i+1];
        next[s[i]][i]=i;
    }
    for(i=1;i<=n;++i)
    {
        for(j=0;j<10;++j)
            last[j][i]=last[j][i-1];
        last[s[i]][i]=i;
    }
    i=1;j=n;
    do
    {
        maxt=(rez[0]==0);
        for(k=1;k<10;++k)
            if(dp[next[k][i]][last[k][j]]>=dp[next[maxt][i]][last[maxt][j]])
                maxt=k;
        if(dp[next[maxt][i]][last[maxt][j]]==0)
            break;
        rez[rez[0]+1]=rez[rez[0]+dp[next[maxt][i]][last[maxt][j]]]=maxt;
        ++rez[0];
        i=next[maxt][i]+1;
        j=last[maxt][j]-1;
    }while(1);
    rez[0]*=2;
    if(rez[rez[0]]==0)
        --rez[0];
    for(i=1;i<=rez[0];++i)
        printf("%d",rez[i]);
    printf("\n");
}