题目描述:
blablablablablablablablablabla 传送门
算法思想:
dp题
状态表示:dp[i]
表示到i
个字符的最长不下降子序列的长度
状态转移:每当当前的子序列为上升且长度大于maxx时,就更新maxx
时间复杂度:
O ( n 2 ) O(n^2) O(n2)
代码实现:
#include <bits/stdc++.h>
using namespace std;
const int N=5010;
int a[N], dp[N]; //dp[i]表示到i个字符之前的最长不下降子序列的长度
int main(){
int n, ans=0;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
int maxx=0;
for(int j=1;j<i;j++){
if(a[j]<=a[i]&&dp[j]>maxx){ //a[j]<=a[i]保证不下降
maxx=dp[j];
}
}
dp[i]=maxx+1;
}
for(int i=1;i<=n;i++){
if(ans<dp[i]) ans=dp[i];
}
cout<<ans<<endl;
return 0;
}
欢迎复制