/****************************************************
求最长子序列
****************************************************/
#include<stdio.h>
#include<stdlib.h>
#define Max_Num 1010
int b[Max_Num],Maxlen[Max_Num],*p;//Maxlen[3]表示的是b[1 2 3]这三个数所对应的最长子序列的长度
int main()
{
int N,i,j,tmp,k,l;
scanf("%d",&N);
for(i=1;i<=N;i++)
scanf("%d",&b[i]);
Maxlen[1]=1;//第一个数为终点是最长子序列长度恒为1
for(i=2;i<=N;i++){//求以第一个为终点之后的序列的最长子序列的长度
tmp=0;
for(j=1;j<i;j++){
if(b[i]>b[j]&&tmp<Maxlen[j])
tmp=Maxlen[j];
}
Maxlen[i]=tmp+1;
}
tmp=-1;
for(i=1;i<=N;i++)
{
if(tmp<=Maxlen[i])
{tmp=Maxlen[i];l=i;}
}
printf("最长的子序列长度为%d 且该序列为",tmp);
k=tmp;
p=(int *)malloc(sizeof(int)*k);
for(i=1;i<=tmp;i++)
{
for(j=l;j>=1;j--)
if(k==Maxlen[j]&&b[j]<=b[l])
{
k--;l=j;break;
}
p[i]=b[l];
}
for(i=tmp;i>=1;i--)
printf("%d ",p[i]);
printf("END");
return 0;
}
求最长子序列
最新推荐文章于 2022-08-22 11:22:14 发布