数组中最长递增子序列
2016-08-17 11:06
169 查看
数组是乱序的,如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)。
代码如下:
根据无后效性定义,数组中当前元素所形成的子序列与其前面元素形成的子序列没有关系,所以:
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; }
相关文章推荐
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 编程之美2.16——求数组中最长递增子序列
- 求数组中最长递增子序列
- 编程之美2.16求数组中最长递增子序列
- 编程之美2.16求数组中最长递增子序列Java版
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 编程之美2.16 求数组中最长递增子序列
- 编程之美-2.16-求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 《编程之美》读书笔记17: 2.16 求数组中最长递增子序列
- 求数组中最长递增子序列问题
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 编程之美--求数组中最长递增子序列
- 给定一个整数数组,求它的一个最长递增子序列。
- 编程之美---求数组中最长递增子序列LIS
- 读书笔记之编程之美 - 2.16 求数组中最长递增子序列