传送门
题意
给定长度为 (n) 的序列 (a_{i}),求其最长上升子序列的长度
数据范围
(1leq nleq 1000)
题解
- (dp[i]) 表示 (1sim 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;
}