Cod sursa(job #2580731)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 13 martie 2020 23:53:23
Problema Elimin 2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 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,sum,lungime;

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])
   {
    if(dr[y][c]==st[x][c]) sum=1;
    else
     sum=2;
    if(dp[st[x][c]+1][dr[y][c]-1]+sum>ramas)
     {
      ramas=dp[st[x][c]+1][dr[y][c]-1]+sum;
      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(dr[lung][c]==st[1][c]) sum=1;
    else
     sum=2;
    if(dp[st[1][c]+1][dr[lung][c]-1]+sum>ramas)
     {
      ramas=dp[st[1][c]+1][dr[lung][c]-1]+sum;
      lit=c;
      ind1=st[1][c]+1; ind2=dr[lung][c]-1;
     }
   }
 }
tr++; numar[tr]=lit;
lungime=ramas;
if(ind1<=ind2)
 drum(ind1,ind2);
for(int i=1;i<=tr;i++)
 g<<numar[i];
if(ramas%2==0)
 for(int i=tr;i>=1;i--)
 g<<numar[i];
else
 for(int i=tr-1;i>=1;i--)
 g<<numar[i];
}