Pagini recente » Cod sursa (job #253482) | Cod sursa (job #2728387) | Cod sursa (job #2120330) | Cod sursa (job #2383466) | Cod sursa (job #992666)
Cod sursa(job #992666)
#include<stdio.h>
#include<cstring>
#include<algorithm>
#define maxn 5005
#define inf 0x3f3f3f3f
using namespace std;
int n,s,len=inf,nr;
int a[maxn];
int best[maxn],p[maxn],up[maxn];
int sol[maxn],aux[maxn];
//up[i] -cel mai mic nr din a care poate continua subs cresc maximal ce se term in i
void read()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
}
void get_sol(int k,int v[maxn])
{
if(k==0) return;
get_sol(p[k],v);
v[++nr]=k;
}
int less_lex()
{
for(int i=1;i<=nr;i++)
if(a[aux[i]]<a[sol[i]]) return 1;
else
if(a[aux[i]]>a[sol[i]]) return 0;
return 0;
}
void solve()
{
int i,j,minn,pc;
for(i=1;i<=n;i++) up[i]=inf;
best[1]=1; a[0]=inf;
for(i=2;i<=n;i++)
{
minn=inf; pc=0;
for(j=1;j<i;j++) if(a[j]<=a[i])
{
if(up[j]>a[i])
if(minn>best[j] || (best[j]==minn && a[j]<a[pc]))
minn=best[j],pc=j;
up[j]=min(up[j],a[i]);
}
best[i]=best[pc]+1; p[i]=pc;
}
for(i=1;i<=n;i++)
if(up[i]==inf)
{
if(len>best[i]) nr=0,get_sol(i,sol),len=best[i];
else
if(len==best[i])
{
nr=0; get_sol(i,aux);
if(less_lex()) memcpy(sol,aux,sizeof(aux));
}
}
}
void print()
{
for(int i=1;i<=nr;i++) printf("%d ",sol[i]);
}
int main()
{
freopen("subsir2.in","r",stdin);
freopen("subsir2.out","w",stdout);
read();
solve();
printf("%d\n",len);
print();
fclose(stdin);
fclose(stdout);
return 0;
}