2.16 求数组中最长递增子序列

来源:互联网 发布:ios 模仿淘宝地址选择 编辑:程序博客网 时间:2024/06/07 05:45

题目:

求一个一维数组(N个元素)中最长递增子序列的长度


方法一:


DP题

代码如下:

#include <iostream>using namespace std;const int MAXN = 100000;const int INF = 10000000;int minV[MAXN], lis[MAXN], Array[MAXN];int n;//lis[i]表示从第i个元素开始的最长序列的长度//minV[i]表示所有长度为i的序列中,最大的元素的最小值//Array这个数组代表的是原始数组int LIS(int *A, int n) {int nMaxLen = 1;     //数组最长递增子序列的长度for(int i = 0; i < n; ++i) lis[i] = 1;      //初始化最长递增序列的信息   minV[0] = -INF;minV[1] = A[0];for(int i = 1; i < n; ++i) {//遍历历史最长递增序列信息int j = 0;//要提高效率的话,这里可以改为二分搜索for(j = nMaxLen; j >= 0; --j) {if(A[i] > minV[j]) {lis[i] = j + 1;break;}}//如果当前最长序列大于最长递增序列长度,更新最长信息if(lis[i] > nMaxLen) {nMaxLen = lis[i];minV[nMaxLen] = A[i];}else if(A[i] > minV[j] && A[i] < minV[j + 1]) {minV[j + 1] = A[i];}}return nMaxLen;}int main() {cin >> n;for(int i = 0; i < n; ++i) cin >> Array[i];cout << LIS(Array, n) << endl;return 0;}


方法二:


利用最长公共子序列,求最长递增子序列:

假设原数组是:(5,6,7,1,2,8)

要求他的最长递增子序列的话。

只需先将原数组进行排序!得到:(1,2,5,6,7,8)

然后再求这两个数组的lcs(最长公共子序列)



0 0
原创粉丝点击