Pagini recente » Cod sursa (job #2847822) | Cod sursa (job #1857311) | Cod sursa (job #637398) | Cod sursa (job #1619389) | Cod sursa (job #2606931)
#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]);
}