题目描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

样例

样例输入

389 207 155 300 299 170 158 65

样例输出

6
2

分析:本题共两问:第一问可以等价为求最大不上升子序列。这样问题就简单了。

首先定义一个i和j。j想对于i更新较快,j<=i。

定义f[i]表示从1到i的最大非上升子序列长度,a[i]为i的高度。如果a[j]>a[i]那么f[i]就可能需要更新所以f[i]=max(f[i],f[j]+1);

1 for(int i=1;i<=n;i++){
2 f[i]=1; //一定不要忘记第一个也算一个
3 for(int j=1;j<i;j++){
4 if(h[i]<=h[j]) f[i]=max(f[i],f[j]+1);
5 }
6 maxx=max(maxx,f[i]);
7 }

核心代码

第二问我一开始想的是用多次求最长不上升子序列,但这个想法显然是错的比如“7 5 4 1 6 3 2”用多次求最长不上升序列所有为”7 5 4 3 2”,
”1”,”6”共3套系统;但其实只要2套,分别为:”7 5 4 1”与”6 3 2”。

正确做法(还有一种做法,效率(n2),超时了,就不说了)第二问的,我们需要用到Dilworth定理:最少链划分=最长反链长度

for(int i=1;i<=n;i++){
g[i]=1;
for(int j=1;j<i;j++){
if(h[i]>h[j]) //求最长上升子序列的长度
g[i]=max(g[i],g[j]+1);
}
mixn=max(mixn,g[i]);
}

核心代码

#include<bits/stdc++.h>
using namespace std;
const int L=200+100;
int n=1,h[L],a[L],f[L],g[L],maxx=-11111111,mixn=-11111111;
int main(){
while (scanf("%d",&h[n])!=EOF)
n++;
n--;
for(int i=1;i<=n;i++){
f[i]=1; //记录第i个前面的最长不上升子序列的长度
for(int j=1;j<i;j++){
if(h[i]<=h[j]) f[i]=max(f[i],f[j]+1);
}
maxx=max(maxx,f[i]);
}
for(int i=1;i<=n;i++){
g[i]=1;
for(int j=1;j<i;j++){
if(h[i]>h[j]) //求最长上升子序列的长度
g[i]=max(g[i],g[j]+1);
}
mixn=max(mixn,g[i]);
}
printf("%d\n%d\n",maxx,mixn);
return 0;
}

完整代码

拦截导弹简单版——线性dp的更多相关文章

  1. 拦截导弹简单版(读入一串整数时getline(cin,s) stringstream is(s);)

    拦截导弹简单版 时间限制: 1 Sec  内存限制: 128 MB提交: 40  解决: 16[提交][状态][讨论版][命题人:外部导入] 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系 ...

  2. nyoj 236拦截导弹 简单动归(java)

    C/C++: #include<stdio.h> int main() { // freopen("250.txt","r",stdin); ],b ...

  3. 2018.08.16 洛谷P2029 跳舞(线性dp)

    传送门 简单的线性dp" role="presentation" style="position: relative;">dpdp. 直接推一推 ...

  4. [CodeForces - 1272D] Remove One Element 【线性dp】

    [CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...

  5. 线性DP之机器分配

    题目大意 自己瞅 (懒得打了) 思路 前面是很简单的线性dp,后面是模拟递归输出方案, 模拟递归可以设ny为机器数机器数,nx表示第nx个公司,tot为总盈利,那么则有\(a[nx][i]+dp[nx ...

  6. 百练_2945 拦截导弹(DP)

    描述 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭 ...

  7. 题目:[NOIP1999]拦截导弹(最长非递增子序列DP) O(n^2)和O(n*log(n))的两种做法

    题目:[NOIP1999]拦截导弹 问题编号:217 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发 ...

  8. dp练习(10)——拦截导弹

    1044 拦截导弹 1999年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descripti ...

  9. BZOJ 2244: [SDOI2011]拦截导弹 DP+CDQ分治

    2244: [SDOI2011]拦截导弹 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截 ...

随机推荐

  1. 双向绑定数据的实现(new Proxy 版本)

    调用 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  2. Charles 抓包(Charles二)

    前面安装了Charles,并初步配置了一下:https://blog.csdn.net/qq_38175040/article/details/105411407 今天开始正式抓包了 但过程却不是很顺 ...

  3. adb命令—monkey篇

    monkey 目录 monkey 1.Monkey介绍 2.Monkey是用来做什么的 3.Monkey程序介绍 下面就是一些Monkey命令了 1.Monkey介绍 顾名思义,Monkey就是猴子, ...

  4. 学习 | mockjs入门

    最近工作有用到mockjs模拟数据,实现前后端分离,今天系统的把mockjs的API都过了一遍,算是入门吧. 什么是mockjs mockjs就是一个模拟数据,生成随机数据,拦截ajax请求. 为什么 ...

  5. k8s运行容器之Job(四)

    Job 容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序, ...

  6. 测试必备:jmeter测试http协议接口的各种传参方式

    测试接口,postman和jmeter是用得最频繁的工具,特别是jmeter,支持很多种协议,且除了测功能,还能做自动化测试和性能测试.下面主要介绍jmeter测试http协议接口的用法,包含get, ...

  7. 005.操作系统及Linux系统,虚拟机的作用和发展历史

    操作系统及其作用 操作系统发展史 Linux系统 虚拟机 操作系统 操作系统 操作系统的作用 不同领域的主流操作系统 操作系统(Operation System,OS) 操作系统作为接口的示意图 没有 ...

  8. HotSpot VM执行引擎的实现

    Java代码的执行分类: 第一种是将源代码编译成字节码文件,然后再运行时通过解释器将字节码文件转为机器码执行 第二种是编译执行(直接编译成机器码).现代虚拟机为了提高执行效率,会使用即时编译技术(JI ...

  9. 给你的MyBatis-Plus装上批量插入的翅膀

    努力和选择,哪个更重要?关注微信公众号[天开易想]这是一位懂互联网研发和架构的户外.篮球老铁 前言 各位好,我是易哥(thinkYi). 大家有用过MyBatis-Plus(简称MP)的都知道它是一个 ...

  10. 关于kafka中consumer subscribe与asssign的理解

    kafka中consumer subscribe与asssign的理解: https://blog.csdn.net/weixin_34332905/article/details/91392030