最长子序列的问题求解

给你一组数据
比如
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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值