侧边栏壁纸
博主头像
Hope博主等级

努力赚钱的工科研究生

  • 累计撰写 362 篇文章
  • 累计创建 129 个标签
  • 累计收到 5 条评论
标签搜索

Acwing 1010. 拦截导弹

Hope
2022-03-31 / 0 评论 / 0 点赞 / 472 阅读 / 519 字
温馨提示:
本文最后更新于 2022-03-31,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Acwing 1010. 拦截导弹

思路:

021D0D044FFA5B2BE560BF98C179CEB7.png

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int n;
const int N=1010;
int f[N],a[N];
int q[N];//q[i] 长度为i的子序列结尾的值

int main(){
    while(cin>>a[n]) n++;
    //cnt表示数组里面子序列的数量 最少几个子序列可以Cover导弹
    int cnt=0;
    int res=0;
    for(int i=0;i<n;i++){
        
        f[i]=1;
        for(int j=0;j<i;j++){
            //最长下降子序列
            if(a[i] <= a[j]){
                f[i]=max(f[i],f[j] + 1);
            }
            res=max(res,f[i]);
        }
        int k=0;
        //在q数组里面找到最小的大于a[i]的子序列结尾
        while(k<cnt && q[k] < a[i]) k++;
        q[k]=a[i]; 
        if(k>=cnt) cnt++;
    }
    cout<<res<<endl<<cnt<<endl;
    return 0;
}
0

评论区