【模版】 最长上升子序列
传送门
题意
给定长度为 \(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;
}