Cod sursa(job #2606931)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 28 aprilie 2020 21:24:18
Problema Elimin 2 Scor 100
Compilator cpp-64 Status done
Runda aflafafew Marime 2.19 kb
#include <iostream>
#include <bits/stdc++.h>
#define ull unsigned long long int
#define nmax 2005
using namespace std;


short dp[2005][2005],nxt[2005][10],ant[2005][10];
char s[2005];
short sol[2005];
int n;
short min(short a,short b)
{
    if(a<b) return a;
    return b;
}
short max(short a,short b)
{
    if(a>b) return a;
    return b;
}
void calcnext()
{
    vector<int> last(10,-1);
    for(int i=n;i>=0;i--)
    {
        for(int j=9;j>=0;j--)
        {
            nxt[i][j]=last[j];
        }
        last[s[i]-'0']=i;
    }
}
void calcant()
{
    vector<int> last(10,-1);
    for(int i=1;i<=n+1;i++)
    {
        for(int j=9;j>=0;j--)
        {
            ant[i][j]=last[j];
        }
        last[s[i]-'0']=i;
    }
}
void calcdp()
{
    for(int i=1;i<=n;i++)
        dp[i][i]=1;
    for(int dif=2;dif<=n;dif++)
    {
        for(int i=1;i+dif-1<=n;i++)
        {
            int j=i+dif-1;
            dp[i][j]=dp[i+1][j-1];
            if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1]+2;
            dp[i][j]=max(dp[i][j],dp[i+1][j]);
            dp[i][j]=max(dp[i][j],dp[i][j-1]);


        }
    }
}
void getsol(int st,int dr,int lung,int l,int r)
{
    if(st>dr||l>r) return;
    if(lung<=0) return;
    int maxcifra=0;
    for(int cifra=9;cifra>=0;cifra--)
    {
        if(nxt[st][cifra]==-1||ant[dr][cifra]==-1) continue;
        if(dp[nxt[st][cifra]][ant[dr][cifra]]==lung)
        {
            sol[l]=cifra;
            sol[r]=cifra;
            getsol(nxt[st][cifra],ant[dr][cifra],lung-2,l+1,r-1);
            break;
        }
    }
}

int main()
{
    freopen ("elimin2.in", "r", stdin);
  freopen ("elimin2.out", "w", stdout);
  scanf ("%s", s + 1);
   n=strlen(s+1);
   calcnext();
   calcant();
   calcdp();
   int lmax=0;
   int cifra=0;

   for(int i=9;i>=1;i--)
   {
       if(nxt[0][i]==-1||ant[n+1][i]==-1) continue;
       if(dp[nxt[0][i]][ant[n+1][i]]>lmax)
       {
           lmax=dp[nxt[0][i]][ant[n+1][i]];
           cifra=i;
       }
   }
   sol[1]=cifra;
   sol[lmax]=cifra;
   getsol(nxt[0][cifra],ant[n+1][cifra],lmax-2,2,lmax-1);
   for(int i=1;i<=lmax;i++)  printf ("%d", sol[i]);






}