两道NOIP里的DP题目~
拦截导弹 来源:NOIP1999(提高组) 第一题
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入数据为两行,
第一行为导弹的数目N(n<=1000)
第二行导弹依次飞来的高度,所有高度值均为不大于30000的正整数。
1.输出只有一行是这套系统最多能拦截的导弹数和 2.要拦截所有导弹最少要配备这种导弹拦截系统的套数。两个数据之间用一个空格隔开
样例输入
8
389 207 155 300 299 170 158 65
样例输出
6 2
可以先将这个问题分作两个小问题解决,第一个小问明显是要求出最长非严格下降子序列,因为它要保证每一发炮弹都不能高于前一发的高度
第二个小问则是要你求出最长严格上升子序列,这个结论就不能明显的出啦,因为一开始我也想不出来,也是看了题解才懂。
证明过程:
目标首先是要保证所有的目标都要摧毁,既然每个目标都要被摧毁,那么如果这个被摧毁的目标的后面的目标比它搞的话,摧毁这个目标
的导弹系统就不能摧毁它后面的目标了。从而,我们所需要的炮弹系统的高度必定是严格上升的序列~又因为要摧毁所有的目标,所以为最长严格
上升子序列~
ps:这道题的数据目测比较弱,第二问我用非严格上升去做也能ac。。。。。
附上ac的c++代码:
#include <cstdio>
#include <iostream> using namespace std;
const int maxn = ;
int a[maxn],inc[maxn],dece[maxn];
const int INF = 0x3f3f3f3f;
int main(){
int n;
while(~scanf("%d",&n)){
int INC = ,DEC = ;
fill(a,a + maxn,);
fill(inc,inc + maxn,);
fill(dece,dece + maxn,);
for(int i = ;i <= n;++i)
scanf("%d",&a[i]);
a[] = INF;//注意 初始化
for(int i = ;i <= n;++i){
for(int j = ;j <= i-;++j){
if(a[i] <= a[j]&&dece[i] < dece[j] + ) //非严格下降子序列
dece[i] = dece[j] + ;
}
//cout<<dece[i];
DEC = max(DEC,dece[i]);
}
//cout<<endl;
a[] = -INF;//注意重新初始化
for(int i = ;i <= n;++i){
for(int j = ;j <= i-;++j){
if(a[i] > a[j]&&inc[i] < inc[j] + ) //严格上升子序列
inc[i] = inc[j] + ;
}
//cout<<inc[i];
INC = max(INC,inc[i]);
}
//cout<<endl;
printf("%d %d\n",DEC,INC);
}
return ;
}
合唱队形 来源:NOIP2004(提高组) 第一题
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
样例输入
8
186 186 150 200 160 130 197 220
样例输出
4
思路:
设dec[i] 是以a[i] 为结尾的最长严格上升序列,inc[i] 是以a[i]开始的最长严格下降序列,所以 最终答案是 n - max(dec[i] + inc[i] - 1);
dec[i] 和inc[i] 仿照上面那道题 即可,不过注意代码细节有所不同
#include <cstdio>
#include <iostream> using namespace std;
const int maxn = ;
int a[maxn],inc[maxn],dece[maxn];
const int INF = 0x3f3f3f3f;
int main(){
int n;
while(~scanf("%d",&n)){
int INC = ,DEC = ;
fill(a,a + maxn,);
fill(inc,inc + maxn,);
fill(dece,dece + maxn,);
for(int i = ;i <= n;++i)
scanf("%d",&a[i]);
a[] = -INF;//注意 初始化
for(int i = ;i <= n;++i){
for(int j = ;j <= i-;++j){
if(a[i] > a[j]&&dece[i] < dece[j] + ) //
dece[i] = dece[j] + ;
}
}
a[n+] = -INF;//注意重新初始化
for(int i = n;i >= ;--i){
for(int j = n+;j >= i + ;--j){
if(a[i] > a[j]&&inc[i] < inc[j] + ) //
inc[i] = inc[j] + ;
}
}
int ans = ;
for(int i = ;i <= n;i++){
ans = max(ans,dece[i] + inc[i]);
}
printf("%d\n",n - ans + );
}
return ;
}
两道NOIP里的DP题目~的更多相关文章
- 两道很好的dp题目【4.29考试】
A 问题描述: 对于一个排列,考虑相邻的两个元素,如果后面一个比前面一个大,表示这个位置是上升的,用I表示,反之这个位置是下降的,用D表示.如排列3,1,2,7,4,6,5可以表示为DIIDID. 现 ...
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...
- 与高精死杠的几天——记两道简单的高精dp
(同样也是noip往年的题 1.矩阵取数游戏 题目链接[Luogu P1005 矩阵取数游戏] \(\mathcal{SOLUTION}:\) 通过对题目条件的分析,我们可以发现,每一行取数对答案的 ...
- leetcode简单题目两道(2)
Problem Given an integer, write a function to determine if it is a power of three. Follow up: Could ...
- 方阵里面的dp
打了一场luogu的信心赛,惊讶地发现我不会T2,感觉像这样在矩阵里面的dp看起来很套路的样子,但是仔细想想还是有很多需要注意的细节. 又想到之前貌似也考过一些类似的题目 然而我并没有改 ,于是打算补 ...
- 两道面试题,带你解析Java类加载机制
文章首发于[博客园-陈树义],点击跳转到原文<两道面试题,带你解析Java类加载机制> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Gr ...
- 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)
本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...
- 几道经典的SQL笔试题目
几道经典的SQL笔试题目(有答案) (1)表名:购物信息 购物人 商品名称 数量 A 甲 2 B 乙 ...
- ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)
两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...
随机推荐
- lucene-5.3.1配置(win7x64)
lucene下载地址:http://www.us.apache.org/dist/lucene/java/5.3.1/lucene-5.3.1.zip 下载之后解压 控制台应用程序下配置: 找到luc ...
- set/multiset用法详解
集合 使用set或multiset之前,必须加入头文件<set> Set.multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素. sets和mul ...
- K-th Number POJ - 2104 划分树
K-th Number You are working for Macrohard company in data structures department. After failing your ...
- CF585E:Present for Vitalik the Philatelist
n<=500000个2<=Ai<=1e7的数,求这样选数的方案数:先从其中挑出一个gcd不为1的集合,然后再选一个不属于该集合,且与该集合内任意一个数互质的数. 好的统计题. 其实就 ...
- 【Intellij 】Intellij IDEA 添加jar包的三种方式
一.直接复制:(不推荐) 方法:直接将硬盘上的jar包复制粘贴到项目的lib目录下即可. 注意: 1.对于导入的eclipse项目,该方式添加的jar包没有任何反应,用make编译项目会报错 2.对于 ...
- UVA 674_Coin Change
题意: 给定一个数,求用1,5,10,25,50有多少种组合方式. 分析: 简单计数dp,dp[i][j]表示由前i+1个元素组成j的种数,注意dp[i][0]初始化为1,因为一个元素也不选的方法总是 ...
- 二级域名相同的情况下子页面调用父页面的js方法
这两天项目遇到这种需求.项目是一个平台级系统,其中嵌入了多款应用.在平台上可以使用这些应用操作业务. 现在产品提出了个需求:即在A应用中需要调用js方法来打开B应用. 处理方法是:平台js中给出个打开 ...
- 携程Apollo(阿波罗)配置中心本地开发模式不接入配置中心进行本地开发
官方教程:https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8 ...
- LENOVO System x3850 X6
http://appserver.lenovo.com.cn/Lenovo_Series_List.aspx?CategoryCode=A31B01
- tornado的http服务器实现
使用tornado实现的一个简单http服务器:只需要定义自己的处理方法,其他的东西全部交给tornado完成. #coding:utf-8 import tornado.httpserver imp ...