Cod sursa(job #2944744)

Utilizator biancalautaruBianca Lautaru biancalautaru Data 22 noiembrie 2022 22:00:00
Problema Elimin 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <cstring>
#define DIM 2005
using namespace std;
ifstream fin("elimin2.in");
ofstream fout("elimin2.out");
int n,lmax;
char s[DIM];
short dp[DIM][DIM],nxt[DIM][10],prv[DIM][10];

void reconst(int st,int dr,int lg) {
    if (st<=dr)
        for (int i=9;i>=0;i--)
            if (dp[nxt[st][i]][prv[dr][i]]==lg) {
                fout<<i;
                reconst(nxt[st][i]+1,prv[dr][i]-1,lg-2);
                if (lg>=2)
                    fout<<i;
                return;
            }
}

int main() {
    fin>>(s+1);
    n=strlen(s+1);
    for (int i=1;i<=n;i++)
        dp[i][i]=1;
    for (int lg=2;lg<=n;lg++)
        for (int i=1;i<=n-lg+1;i++) {
            int j=i+lg-1;
            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 (int j=0;j<=9;j++)
        nxt[n+1][j]=n+1;
    for (int i=n;i>=1;i--) {
        for (int j=0;j<=9;j++)
            nxt[i][j]=nxt[i+1][j];
        nxt[i][s[i]-'0']=i;
    }
    for (int i=1;i<=n;i++) {
        for (int j=0;j<=9;j++)
            prv[i][j]=prv[i-1][j];
        prv[i][s[i]-'0']=i;
    }
    lmax=0;
    for (int i=1;i<=9;i++)
        if (dp[nxt[1][i]][prv[n][i]]>lmax)
            lmax=dp[nxt[1][i]][prv[n][i]];
    reconst(1,n,lmax);
    return 0;
}