题解 | 拦截导弹

#include <bits/stdc++.h>
using namespace std;

const int SIZE=25;

int dp[SIZE];

int main(){
    int n;
    while(cin>>n){
        memset(dp,INT_MIN,sizeof(dp));
        int a[n];
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        int ans=0;
        for(int i=0;i<n;i++){
            dp[i]=1;
            for(int j=0;j<i;j++){
                if(a[j]>=a[i])dp[i]=max(dp[i],dp[j]+1);
            }
            ans=max(ans,dp[i]);
        }
        cout<<ans<<endl;
    }
}

这个问题是查询最大下降长度,属于前面解决的问题,最大子序列长度的变体,问题本质是只允许下降的情况下,去扫描尽可能多的内容,那么,我们就可以这样做这个状态转移方程,对于一个节点,这个自然结果就是1,如果是两个,左侧的比它高,结果就是2,如果比它低当前节点的结果就是1,如果是三个,我们可以发现,也不需要分析前面的第一个,而是直接看前面到底有多少个最大的即可,这样就得到了方程,然后就可以得到,初始状态,每个都一定是1,如果左侧错在一个符合条件的,那么就可以加一,但是可以发现一点,存在递归性质的是,左侧假如本身存在了一些状态的存储,也就是他本身就存在一些下降的结果,那么,后面的就可以直接加一比较一下即可得到自身的新状态。

全部评论

相关推荐

01-12 10:32
已编辑
通州区潞河中学 C++
虾皮 云开放 (N+7)*13.5 + 5w签字费,12%公积金
无助的缄默:互联网技术不如华为,笑死🤣
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务