没人写题解,那我来谢谢吧 本体要求符合平滑曲线的>=30张牌的序列。 本题的状态时f(i) i表示对应到每个数组元素下标 f(i)表示了到对应下标i的满足答案要求的牌数(即a[i]>=a[i-1]) 注意f(i)中每个元素不一定沿着下标值严格递增,可能存在越往后反而满足条件少,所以我们通过cardnum进行维护元素最大值。
#include<cstring>
const int N = 1e9 + 7;
using namespace std;
typedef long long ll;
ll sum,n;
ll a[110],dp[110],cardnum =0;;
int main(){
cin >> n;
for(int i =0;i<n;i++){
cin>>a[i];
}
for(int i =0;i<n;i++){//假设每次只选对应下标牌,前面的牌不选。
dp[i]=1;
}
for(int i =0;i<n;i++){
for(int j =0;j<i;j++){//这层循环作用是确定从第一张牌到第i张牌,满足条件的牌最大数目
if(a[i]>=a[j]){
dp[i]=max(dp[i],dp[j]+1);//dp[j]+1是加上了a[i]这张牌哦(⊙o⊙)
}
cardnum=max(cardnum,dp[i]);//对dp[1]~dp[n-1]中取最大值
}
}
if(cardnum <30)
cout<< "no"<<endl;
else cout<< "yes"<<endl;
//cout<< cardnum;
return 0;
}
谢谢大家观看哈。