求数组中最长递增子序列

来源:互联网 发布:js日期写出某天的日期 编辑:程序博客网 时间:2024/06/06 00:02
#include<stdio.h>
/*
求数组中最长递增子序列长度:
例如:a[10]={1,-1,2,-2,3,-3,4,-4,5,6},递增序列为1,2,3,4,5,6
基本思想:
对于子序列a[0-i],它的最长子序列长度为b[i],
对于子序列a[0-i+1],它的最长子序列有两种情况:
一种是前面的都比a[i+1]大,那么它的最长子序列就是a[i]的最长子序列
一种是前面有比a[i+1]小的数字,那么它的最长子序列就是a[0-i]中取比a[i+1]小的最长子序列加一,
不用关注具体的序列,如果a[i+1]>a[i],那么a[0-i+1]的最长子序列一定是b[0-i]中某个数加一。
*/


void main()
{
    int i,j;
    int a[10]={1,-1,2,-2,3,-3,4,-4,5,6};
    int b[10];
    b[0]=1;
    for(i=0;i<10;i++){
        b[i]=1;
        for(j=0;j<i;j++){
            if((a[i]>a[j])&&(b[i]<=b[j])){
                b[i]=b[j]+1;
            }
        }    
    }

    //下面把b[i]=1的全部替换成b[0-i]中最大的数
    j=b[0];
    for(i=0;i<10;i++){
        
        if(b[i]==1){
            b[i]=j;
        }
        else{
            if(b[i]>j){
                j=b[i]; //把j替换成b[0-i-1]中最大的数
            }
        }
        printf("a[i]前的最长递增序列长度为:%d \n",b[i]);
    }
}
0 0