最长上升子序列


传送门


题意

  对于给定的一个n个数的序列,找到它的一个最长的子序列,并且保证这个子序列是由低到高排序的。

例如,1 6 2 5 4 6 8的最长上升子序列为1 2 4 6 8。

基本思路

  非常显然,这类题用dp求解。 dp[i]表示已i为结尾的最长上升子序列的长度,首先枚举每一个末尾i,然后枚举从1到i-1,如果a[1...i-1]<a[i]说明满足上升子序列,就加上一后取max。

  附上代码。

【模板】最长上升子序列(LIS)及其优化 & 洛谷 AT2827 LIS
 1 //LIS O(n^2)
 2 #include<iostream>
 3 using namespace std;
 4 int dp[100005],a[100005],n,maxx=-999;
 5 int main(){
 6     cin>>n;
 7     for(int i=1;i<=n;i++) cin>>a[i],dp[i]=1;
 8     for(int i=1;i<=n;i++){
 9         for(int j=1;j<i;j++){
10             if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1);//如果后面的大于前面的,就取较大的值。 
11         }
12         maxx=max(maxx,dp[i]);                    //每次更新最大值 
13     }
14     cout<<maxx;
15     return 0;
16 }
O(n^2)代码

相关文章: