Pagini recente » Cod sursa (job #645227) | Cod sursa (job #2558681) | Cod sursa (job #990706) | Cod sursa (job #395435) | Cod sursa (job #3293023)
#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];
}