注意 :跳下一个木桩的高度不大于当前木桩
时间复杂度
(
n
2
)
(n^2)
(n2)
#include<bits/stdc++.h>
using namespace std;
int a[1010];
int dp[1010];
//求最长"不上升"子序列
int main()
{
int n;
cin>>n;
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
cin>>a[i];
dp[i] =1;
}
int num= 1;
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
if(a[i]<=a[j]){
dp[i] = max(dp[i],dp[j]+1);
}
}
num = max(num,dp[i]);
}
cout<<num<<'\n';
return 0;
}
小结:
本题中下一木桩“不高于”当前木桩,存在 < = <= <=的情况,不可借用二分查找的方法计算。二分查找的方式时间复杂度为 n l o g n ( n ) nlogn(n) nlogn(n),只适合于单调的情况,“最长上升子序列"或者"最长下降子序列”。