题目描述

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

输入导弹依次飞来的高度(雷达给出的高度数据是不大于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. Java实现获取命令行中获取指定数据

    执行ipconfig /all获取主机所有网卡信息并分析这些字符串,提取出有效网卡(网卡名称,mac地址,ipv4地址,掩码,网关,dns)将网卡插入HashMap中,key是网卡的名称,value是 ...

  2. Navicat Premium 15.0.17 破解激活(DFoX 注册机)

    Navicat Premium v15.0.17 安装程序和注册机已放入百度网盘,下载地址在本文最后 1. 下载并安装 Navicat Premium 15 在官网下载 Windows 版本的 Nav ...

  3. 【NOIP2012模拟8.7】奶牛编号

    Description Input Output Solution 对于这道题,我们先设0放x个,1放k个k个 设当前剩下x'个0和k'个1,则对于剩下的位置,我们可以把它抽象成将x'个0插入到x'+ ...

  4. linux6.4内核由2.6升级成3.6

    安装CentOS 6.4之后,内核默认是2.6.32.由于docker需要3.0以上的内核,所以需要对内核进行升级. 1. 安装必要组件# yum -y install ncurses-devel # ...

  5. Vue中vue.config的配置

    vue-cli 3.x 脚手架搭建完成后,项目目录中没有 vue.config.js 文件,需要手动在根目录中创建 vue.config.js. vue.config.js 是一个可选的配置文件,如果 ...

  6. 手写spring

    体系结构 Spring 有可能成为所有企业应用程序的一站式服务点,然而,Spring 是模块化的,允许你挑选和选择适用于你的模块,不必要把剩余部分也引入.下面的部分对在 Spring 框架中所有可用的 ...

  7. springboot的文件路径,配置文件

    生成springboot会指定一个包路径,启动的class文件在这个目录下,其他的controller等也要在这个目录的子目录下,不然会扫不到. 一般我们会维护两三个配置文件:生产环境,开发环境,测试 ...

  8. 3.ConcurrentMap-并发Map

  9. 容器云平台No.2~kubeadm创建高可用集群v1.19.1

    通过kubernetes构建容器云平台第二篇,最近刚好官方发布了V1.19.0,本文就以最新版来介绍通过kubeadm安装高可用的kubernetes集群. 市面上安装k8s的工具很多,但是用于学习的 ...

  10. 详尽的 Elasticsearch7.X 安装及集群搭建教程

    为了更好的阅读体验,欢迎访问 原文阅读链接 简介 首先引用 Elasticsearch (下文简称 ES)官网的一段描述: Elasticsearch 是一个分布式.RESTful 风格的搜索和数据分 ...