Cod sursa(job #2130236)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 13 februarie 2018 15:56:10
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <deque>

#define INF 2140000000
#define MOD 1000000007
#define MaxN 2005

using namespace std;

FILE*IN=fopen("elimin2.in","r"),*OUT=fopen("elimin2.out","w");

char str[MaxN];
short d[MaxN][MaxN],Next[MaxN][10],Last[MaxN][10];
int N,s,e,Max=1;
void Solve(int s,int e,int l)
{
    if(l<=0||(s>e))return;
    for(int i=9;i>=0;i--)
    {
        if(d[Next[s][i]][Last[e][i]]==l)
        {
            fprintf(OUT,"%c",i+'0');
            Solve(Next[s][i]+1,Last[e][i]-1,l-2);
            if(l>1)fprintf(OUT,"%c",i+'0');
            return;
        }
    }
}
int main()
{
    fscanf(IN,"%s",str+1);
    N=strlen(str+1);
    for(int i=1;i<=N;i++)
        d[i][i]=1;
    for(int l=1;l<N;l++)
        for(int r=1;r<=N-l;r++)
        {
            int i=r,j=r+l;
            d[i][j]=max(d[i][j-1],d[i+1][j]);
            if(str[i]==str[j]&&2+d[i+1][j-1]>d[i][j])
                d[i][j]=d[i+1][j-1]+2;
        }
    for(int i=9;i>=0;i--)
        Next[N+1][i]=N+1;
    for(int i=1;i<=N;i++)
    {
        memcpy(Next[N+1-i],Next[N+2-i],sizeof Next[N+1-i]);
        memcpy(Last[i],Last[i-1],sizeof Last[i]);
        Next[N+1-i][str[N+1-i]-'0']=N+1-i;
        Last[i][str[i]-'0']=i;
    }
    for(int i=9;i>=1;i--)
        if(d[Next[1][i]][Last[N][i]]>Max)
            Max=d[Next[1][i]][Last[N][i]];
    Solve(1,N,Max);
    return 0;
}