拦截导弹    来源: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题目~的更多相关文章

  1. 两道很好的dp题目【4.29考试】

    A 问题描述: 对于一个排列,考虑相邻的两个元素,如果后面一个比前面一个大,表示这个位置是上升的,用I表示,反之这个位置是下降的,用D表示.如排列3,1,2,7,4,6,5可以表示为DIIDID. 现 ...

  2. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  3. 与高精死杠的几天——记两道简单的高精dp

    (同样也是noip往年的题 1​.矩阵取数游戏 题目链接[Luogu P1005 矩阵取数游戏] \(\mathcal{SOLUTION}:\) 通过对题目条件的分析,我们可以发现,每一行取数对答案的 ...

  4. leetcode简单题目两道(2)

    Problem Given an integer, write a function to determine if it is a power of three. Follow up: Could ...

  5. 方阵里面的dp

    打了一场luogu的信心赛,惊讶地发现我不会T2,感觉像这样在矩阵里面的dp看起来很套路的样子,但是仔细想想还是有很多需要注意的细节. 又想到之前貌似也考过一些类似的题目 然而我并没有改 ,于是打算补 ...

  6. 两道面试题,带你解析Java类加载机制

    文章首发于[博客园-陈树义],点击跳转到原文<两道面试题,带你解析Java类加载机制> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Gr ...

  7. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

  8. 几道经典的SQL笔试题目

      几道经典的SQL笔试题目(有答案) (1)表名:购物信息 购物人      商品名称     数量 A            甲          2 B            乙        ...

  9. ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)

    两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...

随机推荐

  1. ZOJ - 3204 Connect them 最小生成树

    Connect them ZOJ - 3204 You have n computers numbered from 1 to n and you want to connect them to ma ...

  2. ubuntu 安装python 编程环境

    1. 安装python sudo add-apt-repository ppa:fkrull/deadsnakessudo apt-get updatesudo apt-get install pyt ...

  3. PHP:Mysql 基础类

    文章来源:http://www.cnblogs.com/hello-tl/p/7592547.html <?php /** * __construct($Mysql_config) 构造函数 $ ...

  4. Uva 839天平(二叉树dfs, 递归建树)

    题意: 给定一个天平长度 输入格式为 wl dl wr dr 分别代表天平左边长度,左边重量, 右边长度, 右边重量. 如果重量为0, 说明下面还有一个天平, 递归给出. 样例输入:10 2 0 40 ...

  5. BNUOJ 26228 Juggler

    Juggler Time Limit: 3000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 42 ...

  6. [luoguP1042] 乒乓球(模拟)

    传送门 终于过了这sb题了. 当初我连这道题都A不了(╯▔皿▔)╯ 代码 #include <cstdio> #include <iostream> #define N 100 ...

  7. IntentService用于服务中开启子线程的自动关闭

    package com.pingyijinren.test; import android.app.IntentService; import android.content.Intent; impo ...

  8. ZOJ3956 ZJU2017校赛(dp)

    题意:给出n对(h,c) 记  sumh为选出的h的总和  sumc为选出的c的总和 你可以从中选出任意多对(可以不选) 使得  sumh^2-sumh*sumc-sumc^2 最大 输出最大值 输入 ...

  9. 调整JVM内存大小

    首次运行公司项目,出现了内存溢出,具体出现java.lang.OutOfMemoryError: PermGen space和java.lang.OutOfMemoryError:GC overhea ...

  10. 06-js的逻辑结构

    <html> <head> <title>js的逻辑结构和循环结构学习</title> <meta charset="UTF-8&quo ...