数组中最长递增子序列

数组是乱序的,如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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章