Longest Increasing Subsequence
使用DP,时间复杂度为O(n^2)
#include <iostream>
using namespace std;
int lis(int A[],int n){
//状态定义
//d[i]表示"前i"个数中,以"第i"个数结尾的LIS的最长长度是多少
//d[i]=max(d[j]+1,j<i&&nums[j]<=nums[i])
int *d=new int[n];
int len=1;
for (int i=0; i<n; ++i) {
d[i]=1;//初始化,元素自身
for (int j=0; j<i; ++j) {//状态循环
if (A[j]<=A[i]&&d[j]+1>d[i]) {
d[i]=d[j]+1;
}
}
if (d[i]>len) {
len=d[i];
}
}
delete[] d;
return len;//结果
}
int main(){
int A[]={5,3,4,8,6,7};
cout<<lis(A, 6)<<endl;
return 0;
}
使用二分,时间复杂度为O(nlgn),可以参考 LIS详解
参考: