标签:
题目:
求一个一维数组(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; }
标签:
原文地址:http://blog.csdn.net/u010470972/article/details/43115913