题目描述
状态压缩表示
dp[i] = max{1,dp[j]+1} (j = 1,2,…,i-1 && A[j] < A[i])
dp[i]表示到i个字符之前的最长不下降子序列的长度。
a[j]<=a[i]保证不下降
代码实现
极客少年 首页 问题 练习&比赛 状态
排名
关于
Accepted
Time: 43ms Memory: 1MB Lang: C++ Author: jojo1983
ID Status Memory Time Score
1
Accepted
1MB
43ms
17
2
Accepted
1MB
0ms
17
3
Accepted
1MB
1ms
17
4
Accepted
1MB
1ms
17
5
Accepted
1MB
2ms
17
6
Accepted
1MB
2ms
17
#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;
}