用java实现下面的算法题。写出程序...谢谢了。

问题描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是不大于 30000 的正整数),计算这套系统最多能拦截多少导弹,并依次输出被拦截的导弹飞来时候的高度。 样例: INPUT 389 207 155 300 299 170 158 65 OUTPUT 6 (最多能拦截的导弹数) :389 300 299 170 158 65 问题补充:langshao 写道

解决方案

public class MissileIntercept {public static void main(String[] args) {intercept(new int[] { 389, 207, 155, 300, 299, 170, 158, 65 });}private static void intercept(int[] array) {int n = array.length;int[] d = new int[n];int dmax, xh;for (int i = n - 2; i >= 0; i--) { // 从后往前计算d[i]值for (int j = i + 1; j < n; j++) {if ((array[j] <= array[i]) && (d[i] < d[j] + 1)) {d[i] = d[j] + 1;}}}dmax = 0;xh = 1;for (int i = 0; i < n; i++) { // 求出dmaxif (d[i] > dmax) {dmax = d[i];xh = i;}}System.out.println(dmax); // 输出结果System.out.print(array[xh] + " ");int temp = xh;for (int i = xh + 1; i < n; i++) {if (d[i] == d[temp] - 1) {temp = i;System.out.print(array[i] + " ");}}System.out.println();}}
解决方案二:
引用您太神速了,,,能不能给我解释一下动态规划算法呢?理解起来真是费劲呀... 这是很经典的算法,网上有很多,只是用java写的比较少。下面是抄来的: 因为只有一套导弹拦截系统,并且这套系统除了第一发炮弹能到达任意高度外,以后的每一发炮弹都不能高于前一发炮弹的高度;所以,被拦截的导弹应该按飞来的 高度组成一个非递增序列。题目要求我们计算这套系统最多能拦截的导弹数,并依次输出被拦截导弹的高度,实际上就是要求我们在导弹依次飞来的高度序列中寻找 一个最长非递增子序列。 设 X={x 1 ,x 2 ,…,x n } 为依次飞来的导弹序列, Y={y 1 ,y 2 ,…,y k } 为问题的最优解(即 X 的最长非递增子序列), s 为问题的状态(表示导弹拦截系统当前发送炮弹能够到达的最大高度,初值为 s=∞—— 第一发炮弹能够到达任意的高度)。如果 y 1 =x 1 ,即飞来的第一枚导弹被成功拦截。那么,根据题意“每一发炮弹都不能高于前一发的高度”,问题的状态将由 s=∞ 变成 s≤x 1 ( x 1 为第一枚导弹的高度);在当前状态下,序列 Y 1 ={y 2 ,…,y k } 也应该是序列 X 1 ={x 2 ,…,x n } 的最长非递增子序列(大家用反证法很容易证明)。也就是说,在当前状态 s≤x 1 下,问题的最优解 Y 所包含的子问题(序列 X 1 )的解(序列 Y 1 )也是最优的。这就是拦截导弹问题的最优子结构性质。 设 D(i) 为第 i 枚导弹被拦截之后,这套系统最多还能拦截的导弹数(包含被拦截的第 i 枚)。我们可以设想,当系统拦截了第 k 枚导弹 x k ,而 x k 又是序列 X={x 1 ,x 2 ,…,x n } 中的最小值,即第 k 枚导弹为所有飞来的导弹中高度最低的,则有 D(k)=1 ;当系统拦截了最后一枚导弹 x n ,那么,系统最多也只能拦截这一枚导弹了,即 D(n)=1 ;其它情况下,也应该有 D(i)≥1 。 假设系统最多能拦截的导弹数为 dmax (即问题的最优值),则 dmax = max(D(i)) 所以,要计算问题的最优值 dmax ,需要分别计算出 D(1) 、 D(2) 、…… D(n) 的值,然后将它们进行比较,找出其中的最大值。根据上面分析出来的递归方程,我们完全可以设计一个递归函数,采用自顶向下的方法计算 D(i) 的值。然后,对 i 从 1 到 n 分别调用这个递归函数,就可以计算出 D(1) 、 D(2) 、…… D(n) 。但这样将会有大量的子问题被重复计算。比如在调用递归函数计算 D(1) 的时候,可能需要先计算 D(5) 的值;之后在分别调用递归函数计算 D(2) 、 D(3) 、 D(4) 的时候,都有可能需要先计算 D(5) 的值。如此一来,在整个问题的求解过程中, D(5) 可能会被重复计算很多次,从而造成了冗余,降低了程序的效率。 其实,通过以上分析,我们已经知道: D(n)=1 。如果将 n 作为阶段对问题进行划分,根据问题的动态规划递归方程,我们可以采用自底向上的方法依次计算出 D(n-1) 、 D(n-2) 、…… D(1) 的值。这样,每个 D(i) 的值只计算一次,并在计算的同时把计算结果保存下来,从而避免了有些子问题被重复计算的情况发生,提高了程序的效率。

时间: 2024-10-29 18:06:03

用java实现下面的算法题。写出程序...谢谢了。的相关文章

c++-跪求大神帮忙写出程序啊~。

问题描述 跪求大神帮忙写出程序啊-. 大神??啊??朋友给我个题?我真作难了??是这样?: 有29组数字??,选任意8组为一组? 要求 1.?求这8组中共有的数字 ?2.要除掉 12345678 23456789 7 8 9 10 11 12 13 14---- ------23 24 25 26 27 28 29 30---- 2627 28 29 30 31 32 33 等等 这样紧挨着的8组 3.把每8组组合出来 的数字 一一列出??---------- 以下是29组数据: (01)?01

画出流程图,并写出程序,求大神解答!

问题描述 画出流程图,并写出程序,求大神解答! 有一组无符号字节数据,从存储单元DATTA开始存放,数组的长度存放在存储单元SIZE中.试编写一个程序求他们的平均值(保留整数部分),并放在SIZE单元的后面. 要求:画出流程图,并写出程序,求大神解答,谢谢! 解决方案 程序我有,正好是我们的微机作业.但是为了防止别人抄袭我的答案,请先采纳我的回答,我才能发给你. 解决方案二: 作业题 解决方案三: 程序我有,正好是我们的微机作业.但是为了防止别人抄袭我的答案,请先采纳我的回答,我才能发给你.

图片-使用VS2010写出程序并连接数据库实现增删改功能

问题描述 使用VS2010写出程序并连接数据库实现增删改功能 照着图片做出一个程序实现增删改功能 解决方案 这还不简单,就是datagridview控件一个,再放一个dataadapter,都不需要什么代码,配置配置控件就完了.如果你需要我帮你,先采纳了,写给你. 解决方案二: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.D

c# c++-C++代码转化为C#代码 求高手指点,写出注释谢谢啊

问题描述 C++代码转化为C#代码 求高手指点,写出注释谢谢啊 // scDlg.cpp : 实现文件 // #include "stdafx.h" #include "sc.h" #include "scDlg.h" #include ".scdlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序"关于"菜单项的 CAboutDlg 对话框

邮箱-使用VS2010写出程序实现增删改查

问题描述 使用VS2010写出程序实现增删改查 代码已经求人写好了,但是不会建项目 各位大神帮我调试好了发到我邮箱吧~861236126@qq.com代码在下面 建立数据库的代码 CREATE TABLE [dbo].Table NOT NULL, [姓名] NVARCHAR (20) NOT NULL, [性别] BIT NOT NULL, [出生日期] DATETIME NOT NULL, [工作年限] INT NOT NULL, [电话号码] NVARCHAR (20) NOT NULL,

腾讯官方微博出题,半小时写出程序可当初级程序员

问题描述 某一游戏中有一把武器有1到9个等级,每次升级成功的概率为30%,失败的概率为70%,成功升1级,失败降1级,降到一级不能再降,升到9级不能再升,问1000次内升到9级的概率. 解决方案 解决方案二:做不出来的人是不是还算不上程序员撒解决方案三:半小时做出来.就可以去腾讯做初级程序员了..解决方案四:感觉跟概率论的做公交停站次数有些相似,只不过这个会降级,降到1不能降...求初级程序员以上的人解答解决方案五:0.3的8次方乘以9/1000对吗...解决方案六:30%解决方案七:错了,0.

百度知道-【java算法题】凑凑凑凑凑凑字数

问题描述 [java算法题]凑凑凑凑凑凑字数 题目:标题:猜字母???把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串.???接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母.??得到的新串再进行删除奇数位置字母的动作.如此下去,最后只剩下一个字母,请写出该字母./-----------------------------------从百度知道查看但是不懂 1024 和他的思维求大神解惑 /----------------------

一著名软件公司的java笔试算法题的答案

本文为原创,如需转载,请注明作者和出处,谢谢!     原题如下:用1.2.2.3.4.5这六个数字,用java写一个程序,打印出所有不同的排列,如:512234.412345等,要求:"4"不能在第三位,"3"与"5"不能相连.  解题思路:     很明显,这是一个递归算法.我们可以排列将这6个数按从小到大的顺序排一下,如果是1,2,3,4,5,6,那么会有1*2*3*4*5*6= 6!=720个递增的数.但如果是1,2,2,3,4,5,那么

java算法题,公司的笔试题

问题描述 java算法题,公司的笔试题 suppose you have N cakes, N is an interger>0 // at each time, you can either eat 1 cake, or 2 cakes or 3 cakes // PROBLEM: How many ways can you eat all N cakes // for example, N = 4, (1,2,1) and (1,1,2) are considered to be diffe