【模版】 最长上升子序列

传送门

题意

给定长度为 \(n\) 的序列 \(a_{i}\),求其最长上升子序列的长度

数据范围

\(1\leq n\leq 1000\)

题解

  • \(dp[i]\) 表示 \(1\sim i\) 中最长上升子序列的长度
  • 两重循环,每次遍历 \(i\) 之前所有的元素
  • \(a[i]>a[j]\) 时转移方程 \(dp[i]=max(dp[i],dp[j]+1)\)

Code

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n; cin>>n;
    vector<int>a(n+1),dp(n+1);
    for(int i=1;i<=n;i++){
        cin>>a[i]; dp[i]=1;
        for(int j=1;j<i;j++)
            if(a[i]>a[j]) 
                dp[i]=max(dp[i],dp[j]+1);
    }
    int ans=0;
    for(int i=1;i<=n;i++)
        ans=max(ans,dp[i]);
    cout<<ans<<endl;
}
posted @ 2021-02-23 01:07  Hyx'  阅读(61)  评论(0编辑  收藏  举报