Pagini recente » Cod sursa (job #1416029) | Cod sursa (job #670355) | Cod sursa (job #2945171)
#include <fstream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#define NMAX 2001
#define MOD 2020
using namespace std;
int n;
short int dp[NMAX][NMAX];//numarul maxim de cifre ce il palindromul de la poz i la j
short int nxt[10][NMAX];//urmatoarea pozitie a cifrei i dupa pozitia j nxt[i][j]=nxt[i][j+1]
short int prec[10][NMAX];//pozitia precedenta a cifrei i inainte de poz j
char v[NMAX];
ifstream fin ("elimin2.in");
ofstream fout ("elimin2.out");
void precalc()
{
for(int i=0; i<=9; i++)
{
nxt[i][n+1]=n+1;
prec[i][0]=0;
}
for(int i=1; i<=n; i++)
{
//calc pe prec[i][j]
for(int j=0; j<=9; j++)
{
if(v[i]==j+'0')
{
//am cifra j aici
prec[j][i]=i;
}
else{
prec[j][i]=prec[j][i-1];
}
}
}
for(int i=n; i>=1; i--)
{
//calc pe nxt[i][j]
for(int j=0; j<=9; j++)
{
if(v[i]==j+'0')
{
//am cifra j aici
nxt[j][i]=i;
}
else{
nxt[j][i]=nxt[j][i+1];
}
}
}
}
void recons(int st,int dr,int lung)
{
if(lung<=0)
{
return;
}
for(int i=9; i>=0; i--)
{
int lungime=dp[nxt[i][st]][prec[i][dr]];
if(lungime==lung)
{
fout<<i;
recons(nxt[i][st]+1,prec[i][dr]-1,lung-2);
if(lung!=1)
{
fout<<i;
}
break;
}
}
}
int main() {
fin>>(v+1);
n=strlen(v+1);
precalc();
for(int i=1; i<=n; i++)
{
dp[i][i]=1;//palindromul de lungime 1
//fac si pt palindromurile de lungime 2
}
for(int lung=2; lung<n; lung++)
{
for(int st=1; st<=n-lung+1; st++)
{
int dr=st+lung;
if(v[st]==v[dr])
{
dp[st][dr]=dp[st+1][dr-1]+2;
}
else{
dp[st][dr]=max(dp[st+1][dr],dp[st][dr-1]);
}
}
}
//acum verific care cifra are lungimea maxima
int lMax=0,cifra=-1;
for(int i=9; i>=1; i--)
{
int lung=dp[nxt[i][1]][prec[i][n]];
if(lung>lMax)
{
lMax=lung;
cifra=i;
}
}
recons(1,n,lMax);
//fout<<lMax;
return 0;
}