Cod sursa(job #2007260)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 2 august 2017 13:12:20
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define NMax 2010
using namespace std;
const char IN[]="elimin2.in",OUT[]="elimin2.out";
int N;
short T[NMax][NMax],first[NMax][10],last[NMax][10];
char s[NMax];
void write(int x,int y)
{
    if (x>y || !x) return;
    if (x==y)
    {
        printf("%c",s[x]);
        return;
    }
    if (s[x]==s[y]) printf("%c",s[x]);
    for (int c=9;c>=0;--c)if (T[first[x+1][c]][last[y-1][c]]+2==T[x][y])
    {
        write(first[x+1][c],last[y-1][c]);
        break;
    }
    if (s[x]==s[y]) printf("%c",s[x]);
}
int main()
{
    int i,j,k,x,y;
    freopen(IN,"r",stdin);
    scanf("%s",s+1);
    fclose(stdin);
    N=strlen(s+1);
    for (i=1;i<=N;++i)
    {
        for (j=0;j<10;++j) last[i][j]=last[i-1][j];
        last[i][s[i]-'0']=i;
    }
    for (i=N;i>0;--i)
    {
        for (j=0;j<10;++j) first[i][j]=first[i+1][j];
        first[i][s[i]-'0']=i;
    }
    for (i=1;i<=N;++i) T[i][i]=1;
    for (i=x=1;i<=N;++i) if (s[i]>s[x]) x=i;y=x;
    for (k=2;k<=N;++k)
    for (i=1;i+k-1<=N;++i)
    {
        j=i+k-1;
        if (s[i]==s[j]) T[i][j]=T[i+1][j-1]+2;
        else T[i][j]=max(T[i+1][j],T[i][j-1]);
    }
    for (i=10;i>0;--i) if (T[first[1][i]][last[N][i]]>T[x][y]) x=first[1][i],y=last[N][i];
    freopen(OUT,"w",stdout);
    write(x,y);printf("\n");
    fclose(stdout);
    return 0;
}