E03 线性DP B3637 最长上升子序列
E03 线性DP 最长上升子序列_哔哩哔哩_bilibili
状态:$f_{i}$ 表示以 $a_i$ 为结尾的最长上升子序列的长度。
方程:$f_i=max_{1\leq j<i,a_j < a_i}(f_j+1)$
初值:$f_i=1$
答案:$max_{1\leq i \leq n}f_i$
// 线性DP O(n^2) #include<bits/stdc++.h> using namespace std; const int N=5010; int n,a[N],ans; int f[N]; //f[i]表示以 a[i] 结尾的最长上升子序列的长度 int main(){ cin>>n; for(int i=1; i<=n; i++) cin>>a[i]; for(int i=1; i<=n; i++){ f[i]=1; for(int j=1; j<i; j++){ if(a[j]<a[i]) f[i]=max(f[i],f[j]+1); } ans=max(ans,f[i]); } cout<<ans; }
浙公网安备 33010602011771号