Pagini recente » Cod sursa (job #2026541) | Cod sursa (job #1640748) | Istoria paginii runda/simulare_shumen_4 | Cod sursa (job #1740183) | Cod sursa (job #1206719)
#include <cstdio>
#include <algorithm>
#define Nmax 5005
#define INF 2000000000
using namespace std;
int N,a[Nmax],dp[Nmax],prevv[Nmax];
bool valid[Nmax];
inline void LIS()
{
int i,j,p,minim,maxim;
dp[1]=1;
for(i=2;i<=N;++i)
{
minim=INF; p=0; maxim=0;
for(j=i-1;j;--j)
{
if(a[j]>maxim)
if((a[j]<=a[i] && minim>dp[j]) || ((a[j]<=a[i] && minim==dp[j]) && a[j]<a[p]))
{
minim=dp[j]; p=j;
}
maxim=max(maxim,a[j]);
}
if(minim==INF)
dp[i]=1;
else
dp[i]=minim+1;
prevv[i]=p;
}
}
inline int Cmp(int a[], int n, int b[], int m)
{
int i;
for(i=1;i<=n && i<=m && a[i]==b[i];++i);
if(i==n+1)
{
if(i==m+1)
return 0;
else
return 2;
}
else
{
if(i==m+1)
return 1;
else
{
if(a[i]>b[i])
return 1;
return 2;
}
}
}
int main()
{
int i,maxim,minim=INF,aux[Nmax],lenaux,ans,sol[Nmax],lensol,j;
freopen ("subsir2.in","r",stdin);
freopen ("subsir2.out","w",stdout);
scanf("%d", &N);
for(i=1;i<=N;++i)
scanf("%d", &a[i]);
valid[N]=true; maxim=a[N];
for(i=N-1;i;--i)
if(maxim<a[i])
{
valid[i]=true;
maxim=a[i];
}
LIS();
for(i=1;i<=N;++i)
if(valid[i])
minim=min(dp[i],minim);
printf("%d\n", minim);
lensol=1; sol[1]=INF;
for(i=1;i<=N;++i)
if(valid[i] && dp[i]==minim)
{
lenaux=0;
for(j=i;j;j=prevv[j])
aux[++lenaux]=a[j];
reverse(aux+1,aux+lenaux+1);
if(Cmp(aux,lenaux,sol,lensol)==2)
{
lensol=lenaux; ans=i;
for(j=1;j<=lenaux;++j)
sol[j]=aux[j];
}
}
for(lenaux=0,j=ans;j;j=prevv[j])
aux[++lenaux]=j;
reverse(aux+1,aux+lenaux+1);
for(i=1;i<=minim;++i)
printf("%d ", aux[i]);
printf("\n");
return 0;
}