Cod sursa(job #2602653)

Utilizator alex_benescuAlex Ben alex_benescu Data 17 aprilie 2020 16:28:01
Problema Elimin 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#include <string.h>
#define nMax 2005
using namespace std;
ifstream fin("elimin2.in");
ofstream fout("elimin2.out");
short int st[nMax][10], dr[nMax][10], dp[nMax][nMax], len;
int n, i, j, fr;
char s[nMax];
void go(int lo, int hi, int len){
    if(len<=0)
        return;
    for(int j=9;j>=0;j--)
    {
        if(dp[st[lo][j]][dr[hi][j]]==len)
        {
            fout<<j;
            go(st[lo][j]+1, dr[hi][j]-1, len-2);
            if(len>1)
                fout<<j;
            return;
        }
    }
}
int main()
{
    fin>>s+1;
    n=strlen(s+1);
    for(i=1;i<=n;i++)
    {
        for(j=0;j<=9;j++)
            dr[i][j]=dr[i-1][j];
        dr[i][s[i]-'0']=i;
    }
    for(i=n;i>=1;i--)
    {
        for(j=0;j<=9;j++)
            st[i][j]=st[i+1][j];
        st[i][s[i]-'0']=i;
    }
    for(i=1;i<=n;i++)
        dp[i][i]=1;
    for(fr=1;fr<n;fr++)
        for(i=1;i+fr<=n;i++)
        {
            j=i+fr;
            if(s[i]==s[j])
                dp[i][j]=dp[i+1][j-1]+2;
            else
                dp[i][j]=max(dp[i+1][j], dp[i][j-1]);
        }
    for(j=1;j<=9;j++)
        len=max(len, dp[st[1][j]][dr[n][j]]);
    go(1, n, len);
    return 0;
}