没人写题解,那我来谢谢吧 本体要求符合平滑曲线的>=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;
}

谢谢大家观看哈。