给你一组数据
比如
1 7 4 5 6 8 9
7个数据
求出这一组数据中的最长升序子序列的长度
为了这个问题纠结了很久,由于自己没有学习什么动态规划
所以看了别人的说法也是没法完全明白。
为了简化问题,只求长度
换个思路:
假设我们先定下来最长的子序列的末端,比如说是1
那么初始的原则就是只有一个1,a[1]
长度显然为1,
我们可以求出以每一个数据比如1,7,4,5分别为终端的子序列的长度
怎么去理解呢
继续举例;
我们在有看以7为终端的时候,我们只需判断在1的基础上能不能加上7,可以的话就说明以7为终端的就是以1为终端的长度加1,否则就是以7为终端和以1为终端的长度是一样的
接下来就是以4为终端的情况,就是判断是否能够在以7为终端的序列上面加上4了,是否可以在1的基础上加4,当然求的这个数要是在一系列里面最大的哦。依次类推
就可以求的这一个长度啦。
#include<stdio.h>
#define MAX 100
int a[MAX];
int maxnumber[MAX];
int main()
{
int n,i,j,z,tmp,maxline;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
maxnumber[1]=1;
for(i=2;i<=n;i++)
{
tmp=0;
for(j=i-1;j<=i;j++)
if(a[i]>a[j])
if(tmp<maxnumber[j])
{
tmp=maxnumber[j];
printf("j---->%d maxnumber----->%d\n",j,tmp);
}
maxnumber[i]=tmp+1;
}
maxline=0;
for(i=1;i<=n;i++)
if(maxnumber[i]>maxline)
maxline=maxnumber[i];
printf("%d\n",maxline);
while(2);
}
ps:
文章仅仅是自己做一些记录用,如能博您一阅就深感荣幸,如有问题,欢迎指出,小弟基础比较差。
10-07
10-07
10-07