相关题目

最长上升子序列

怪盗基德的滑翔翼

友好城市

登山

题目描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。

但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。

某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

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

输入格式

共一行,输入导弹依次飞来的高度。

输出格式

第一行包含一个整数,表示最多能拦截的导弹数。

第二行包含一个整数,表示要拦截所有导弹最少要配备的系统数。

输入样例:

389 207 155 300 299 170 158 65

输出样例:

6
2

思路:

1.第一问很简单就是求最长下降子序列;
2.第二问乍一看没想出来,按照不会就模拟的想法我们可以举几个例子来
看看规律,来猜做法;
例1.207 155;     207<155可以构成一个下降子序列,因此只需要一台机器;
例2.207 155 300;207<155可以构成一个下降子序列,但300>207,无法同一一个降序列中,因此需要两个;
例3.155 300 311 299 170;155<300,300<311,因此155无法加入以300
为开头的下降子序列中,300无法加入以311位首的下降子序列中;我们可以由此发现每段上升子序列中的每个导弹都单独需要一个机器来拦截,
例1没有上升子序列,只有一个下降子序列,需要一台;
例2上升子序列中有两个导弹,其中一个导弹正好是下降子序列的头;
例3上升子序列中有三个导弹,其中一个导弹是下降子序列的头;
我们这样就大概猜答案用最长上升子序列来做,事实证明这种做法在洛谷里
会只有100分,若想200分用树状数组这个写不来,哈哈哈哈~,还有就是
我这个做法是是有一个定理的叫Dilworth定理,感兴趣的可以上网查一下;

代码

import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner input=new Scanner(System.in);String [] arr2=input.nextLine().split(" ");int N=arr2.length;int []dp=new int[N+1];int []dp2=new int[N+1];int []arr=new int[N+1];int index=0;for(int i=1;i<=N;i++){arr[i]=Integer.parseInt(arr2[i-1]);}int max=0;for(int i=1;i<=N;i++){dp[i]=1;for(int j=1;j<i;j++){if(arr[i]<=arr[j])dp[i]=Math.max(dp[i],dp[j]+1);max=Math.max(dp[i],max);}}// 在一个序列中,划分成最少的最长不上升子序列的数量等于这个序列的最长上升子序列的长度//所以,我们只要求这个序列最长上升子序列的长度,思路跟第一题差不多,只不过,条件要换成h[i]>h[j]。int max2=0;for(int i=1;i<=N;i++){dp2[i]=1;for(int j=1;j<i;j++){if(arr[i]>arr[j])dp2[i]=Math.max(dp2[i],dp2[j]+1);max2=Math.max(dp2[i],max2);}}System.out.println(max);System.out.println(max2);}}

最长上升子序列模型之拦截导弹相关推荐

  1. 最长上升子序列模型 AcWing 1010. 拦截导弹

    最长上升子序列模型 AcWing 1010. 拦截导弹 原题链接 AcWing 1010. 拦截导弹 算法标签 DP 线性DP 最长上升子序列 思路 摘自该题解 代码 #include<bits ...

  2. C++---最长上升子序列模型---导弹防御系统(每日一道算法2023.3.5)

    注意事项: 本题的dp:"线性dp-最长上升子序列的长度" 本题的贪心(单调队列):"最长上升子序列模型-拦截导弹" 下面思路只讲如何运用这些东西来解这道题 强 ...

  3. 【动态规划专题】最长上升子序列模型

    题目 算法 A.AcWing 895. 最长上升子序列 模板 B.AcWing1017. 怪盗基德的滑翔翼 最长上升子序列/最长下降子序列 C.AcWing 1014. 登山 最长上升子序列/最长下降 ...

  4. ACwing 895 - 最长上升子序列(最长上升子序列模型)

    给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少. 输入格式 第一行包含整数N. 第二行包含N个整数,表示完整序列. 输出格式 输出一个整数,表示最大长度. 数据范围 1 ≤ N ≤ ...

  5. [AcWing] 1012. 友好城市(C++实现)最长上升子序列模型、较为特殊

    [AcWing] 1012. 友好城市(C++实现)最长上升子序列模型 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总 ...

  6. 拦截导弹(dp【最长上升子序列模型】 + 贪心)

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

  7. 【HDU - 1025】Constructing Roads In JGShining's Kingdom(dp最长上升子序列模型 + 二分优化)

    题干: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

  8. 输出最长上升子序列 模型(DP)

    要输出最长上升子序列,只需加一个pre数组,记录新加如序列的前一个.最后遍历一遍数组就可以. 代码如下: #include <iostream>#include <cstdio> ...

  9. 动态规划——最长上升子序列模型

    最长上升子序列 给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少. 输入格式 第一行包含整数 N. 第二行包含 N 个整数,表示完整序列. 输出格式 输出一个整数,表示最大长度. ...

最新文章

  1. Spring整合Struts2
  2. WebSocket 协议
  3. 标题和描述需注意什么才更有利于SEO首页优化?
  4. JPA:确定关系的归属方
  5. [Linux]运输层的端口
  6. [html] IE6文字溢出BUG(别名:多出来的猪、谍影重重)怎么解决呢?
  7. 关于Word2016敲入公式的新方法
  8. Python-进阶-装饰器小结
  9. oracle数据库性能调优技术--深入理解散列连接执行计划
  10. fd抓包数据类型_fd抓包教程 FD入门简介(配置教程) fd视频教程2016
  11. linux小米随身wifi驱动下载,小米随身wifi驱动
  12. 前端vue实现PDF预览
  13. k型热电偶材料_什么是k型热电偶_k型热电偶的测量范围
  14. Excel中如何快速输入☑和☒
  15. 使用DDKWirzard+VS2005开发驱动
  16. python绘图——绘制正负区分的柱形图[ax.bar()]
  17. 习惯,到底有多重要?
  18. SPP-net中的spatial pyramid pooling
  19. 基于openssl的计算机安全学demo(包含Diffie-Hellman,HAMC,AES的简单应用)
  20. itextPDF操作PDF,获取PDF内容

热门文章

  1. SpringCloud多环境配置Profiles
  2. (一)初识DDD(领域驱动设计)
  3. 培训管理工作的核心任务:建立和完善有效的企业体系
  4. Injective 项目评级:B,展望正面 | TokenInsight
  5. 差异表达基因热图怎么看_差异基因热图绘制:heatmap.2
  6. 国内主机整车EEA架构汇总
  7. 单源最短路径-迪杰斯拉特算法
  8. vue 生成二维码并下载
  9. real analysis and functional analysis 讲义
  10. 汇编学习教程:灵活寻址(三)