数组中最长递增子序列

来源:互联网 发布:罗塞塔石碑软件下载 编辑:程序博客网 时间:2024/06/07 03:57

数组是乱序的,如1,-1,2,-3,4,-5,6,-7
根据无后效性定义,数组中当前元素所形成的子序列与其前面元素形成的子序列没有关系,所以:
LIS[i+1] = max(1,LIS[k]+1),其中,array[i+1] > arry[k],且任意k<=i
LIS[i]存储对于当前数组arry[i]形成的最长子序列的长度值,若arry[i+1]>arry[k],那么第i+1个元素可以接在LIS[k]长的子序列后面+1构成一个更长的子序列,k是0~i之间的任意值。还要注意:LIS[K]的长度并不一定大于LIS[K-1]的长度(LIS[3]=1 < LIS[2]=2)。
代码如下:

/求数组中最长递增子序列int LIS(vector<int> data){    if(data.empty())        return -1;    int length = data.size();    vector<int> lis(length,0);    for(int i = 0;i < length;++i)    {        lis[i] = 1;//每一个i长度至少为1        for(int j =0;j < i;++j)        {            if(data[i] > data[j] && lis[j] + 1 > lis[i])//lis[j]最终会取lis[j]中的最大值+1                lis[i] = lis[j] + 1;        }    }    int num = 0;    for(int i = 0;i < length;++i)    {        if(lis[i] > num)            num = lis[i];    }    return num;}
0 0
原创粉丝点击