#include<stdio.h>
#define MAX 1000+10
int a[MAX],max[MAX]={0};//max记录满足条件的,以每个数为终点的上升子序列长度
int main()
{
int n,i,j,t;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
max[1]=1;
for(i=1;i<=n;i++)
{
t=0;//记录第i个数左边最大上升子序列长度,即最大max。
for(j=1;j<i;j++)
{
if(a[i]>a[j])
{
if(max[j]>t)
t=max[j];
}
}
max[i]=t+1;
}
t=0;//记录最长上升子序列。
for(i=1;i<=n;i++)
{
if(max[i]>t)
t=max[i];
}
printf("%d\n",t);
return 0;
}
保存路径;
#include<stdio.h>
#define MAX 1000+10
int a[MAX],max[MAX]={0},find[MAX];//max记录满足条件的,以每个数为终点的上升子序列长度
int main()
{
int n,i,j,t,aa,k=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
max[1]=1;
for(i=1;i<=n;i++)
{
k=0;t=0;//记录第i个数左边最大上升子序列长度,即最大max;k标记作用。
for(j=1;j<i;j++)
{
if(a[i]>a[j])
{
if(max[j]>t)
{
t=max[j];
find[i]=j;
k=1;
}
}
}
if(k==0)
{
find[i]=0;
}
max[i]=t+1;
}
printf("%d\n",find[3]);
t=0;//记录最长上升子序列。
for(i=1;i<=n;i++)
{
if(max[i]>t)
{
t=max[i];
aa=i;
}
}
printf("%d\n",t);
while(1)
{
printf("%d ",a[aa]);
aa=find[aa];
if(aa==0)
break;
}
printf("\n");
return 0;
}