码迷,mamicode.com
首页 > 其他好文 > 详细

[算法]求数组中最长递增子序列长度

时间:2014-07-22 00:17:35      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   for   re   

思路:

1、开辟数组L,L[i]记录的为a[0]~a[i]的最长递增子序列长度

2、开辟数组maxV,maxV[i]记录的为长度为i的各递增子序列的最后一个元素的最小值,譬如有子序列

1,2,4  

1,2,5

则maxV[3] = 4

3、使用maxLen记录当前的最长递增子序列长度

4、转移方程: L[i+1] = max{1,L[j]+1] , a[i] > maxV[j] && j <= maxLen

int LIS(int* a, int n){
    int* maxV = new int[n+1];
    int* L = new int[n];
    maxV[1] = a[0];
    L[0] = 1;
    int maxLen = 1;
    for(int i = 1, j; i < n; ++i){
        L[i] = 1;
        for(j = maxLen; j >= 1; --j){
            if(maxV[j] < a[i]){
                L[i] = j+1;
                break;
            }
        }
        if(L[i] > maxLen){
            maxLen = L[i];
            maxV[maxLen] = a[i];
        }
        else{
            if(j >= 1 && maxV[j+1] > a[i]){
                maxV[j+1] = a[i];
            }
        }
        
    }
    delete[] maxV;
    delete[] L;
    return maxLen;
}

参考编程艺术2.16

[算法]求数组中最长递增子序列长度,布布扣,bubuko.com

[算法]求数组中最长递增子序列长度

标签:style   blog   color   使用   for   re   

原文地址:http://www.cnblogs.com/zhengyuhong/p/3858510.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!