Cod sursa(job #2580727)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 13 martie 2020 23:40:44
Problema Elimin 2 Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>

using namespace std;

ifstream f("elimin2.in");
ofstream g("elimin2.out");

short dp[2005][2005];
short st[2005][11],dr[2005][11];
char sir[2005];
short v[2005],lung;
short numar[2005],lit,ramas,ind1,ind2,tr=0,pipi;

int prec()
{
for(int c=0;c<10;c++)
 st[lung+1][c]=lung+1;
 for(int c=0;c<10;c++)
 {
  for(int i=lung;i>=1;i--)
   {
    if(v[i]==c) st[i][c]=i;
    else st[i][c]=st[i+1][c];
   }
 }
for(int c=0;c<10;c++)
 dr[0][c]=0;
 for(int c=0;c<10;c++)
 {
  for(int i=1;i<=lung;i++)
   {
    if(v[i]==c) dr[i][c]=i;
    else dr[i][c]=dr[i-1][c];
   }
 }
}

int dinamica()
{
for(int i=1;i<=lung;i++)
 dp[i][i]=1;
for(int pas=1;pas<lung;pas++)
 {
  int i=1,j=1+pas;
  for(i,j;j<=lung;i++,j++)
   {
    dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
    if(dr[j][v[i]]>i)
      {
       if(dp[i+1][dr[j][v[i]]-1]+2>dp[i][j])
        dp[i][j]=dp[i+1][dr[j][v[i]]-1]+2;
      }
    if(st[i][v[j]]<j)
      {
       if(dp[st[i][v[j]]+1][j-1]+2>dp[i][j])
        dp[i][j]=dp[st[i][v[j]]+1][j-1]+2;
      }
   }
 }
}

int drum(int x,int y)
{
lit=-1;
ramas=-1;
for(int c=9;c>=0;c--)
 {
  if(dr[y][c]>=st[x][c])
   {
    int caca;
    if(dr[y][c]>st[x][c]) caca=2;
    else caca=1;
    if(dp[st[x][c]+1][dr[y][c]-1]+caca>ramas)
     {
      ramas=dp[st[x][c]+1][dr[y][c]-1];
      lit=c;
      ind1=st[x][c]+1; ind2=dr[y][c]-1;
     }
   }
 }
tr++; numar[tr]=lit;
if(ind1<=ind2)
 drum(ind1,ind2);
}
int main()
{
f>>sir;
lung=strlen(sir);
for(int i=0;i<lung;i++)
 v[i+1]=sir[i]-'0';
prec();
dinamica();
lit=-1;
ramas=-1;
for(int c=9;c>0;c--)
 {
  if(dr[lung][c]>=st[1][c])
   {
    if(dp[st[1][c]+1][dr[lung][c]-1]>ramas)
     {
      ramas=dp[st[1][c]+1][dr[lung][c]-1];
      lit=c;
      ind1=st[1][c]+1; ind2=dr[lung][c]-1;
     }
   }
 }
tr++; numar[tr]=lit;
if(ind1<=ind2) pipi=ramas+2;
else pipi=ramas+1;
if(ind1<=ind2)
drum(ind1,ind2);
for(int i=1;i<=tr;i++)
 g<<numar[i];
if(pipi%2==0)
 for(int i=tr;i>=1;i--)
 g<<numar[i];
else
 for(int i=tr-1;i>=1;i--)
 g<<numar[i];
}