描述

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

格式

输入格式

输入数据只有一行,该行包含若干个数据,之间用半角逗号隔开,表示导弹依次飞来的高度(导弹最多有 20 枚,其高度为不大于 30000 的正整数)。

输出格式

输出数据只有一行,该行包含两个数据,之间用半角逗号隔开。第一个数据表示这套系统最多能拦截的导弹数;第二个数据表示若要拦截所有导弹至少要再添加多少套这样的系统。

样例1

样例输入1

389,207,155,300,299,170,158,65

样例输出1

   6,1

很明显这题首先需要求最长上升序列,这题有比较多的做法,我这里选用LCS(最长公共子序列)做法,但问题是最长公共子序列是求A={a1,a2,a3...an}与B={b1,b2,b3....bm}的最长公共子序列,这里只有一个序列串。

所以首先我们需要copy源串,然后对副本进行降序排序,得到一个序列,然后两个序列进行LCS就可以得出最长下降序列了。

然后回溯找出LCS中求出的串,对源串进行删除,最后递归执行直到源串为0就好了。

Java AC Code:
public class Main {
//最长下降序列长度
public static int m = 0;
//还需要多少飞弹
public static int need = 0; public static void main( String[] args ) { Scanner sc = new Scanner( System.in );
while( sc.hasNext() ) {
m=0;
need=0;
String str = sc.nextLine();
int[] nums = getSplits( str, "," );
List<Integer> list = new ArrayList<Integer>();
for( int i = 0; i < nums.length; i++ ) {
list.add( nums[ i ] );
}
LCS( nums,list );
System.out.println( m+","+(need-1) );
}
}
//进行LCS
public static void LCS( int[] nums, List<Integer> list ) {
int[] sortNums = new int[ nums.length ];
int[][] b = new int[ nums.length + 1 ][ nums.length + 1 ];
int n = nums.length;
for( int i = 0; i < n; i++ ) {
sortNums[ i ] = nums[ i ];
}
Arrays.sort( sortNums );
int[] descNums = new int[ n ];
for( int i = 0; i < n; i++ ) {
descNums[ i ] = sortNums[ n - i - 1 ];
}
int[][] lcs = new int[ n + 1 ][ n + 1 ];
for( int i = 1; i <= n; i++ ) {
for( int j = 1; j <= n; j++ ) {
if( nums[ i - 1 ] == descNums[ j - 1 ] ) {
lcs[ i ][ j ] = lcs[ i - 1 ][ j - 1 ] + 1;
b[ i ][ j ] = 0;
} else {
if( lcs[ i - 1 ][ j ] > lcs[ i ][ j - 1 ] ) {
lcs[ i ][ j ] = lcs[ i - 1 ][ j ];
b[ i ][ j ] = -1;
} else {
lcs[ i ][ j ] = lcs[ i ][ j - 1 ];
b[ i ][ j ] = 1;
}
}
}
} //递归求need,并且判断获取最长的下降序列。
m = lcs[n][n] > m?lcs[n][n]:m;
while(list.size() !=0){
printLCS( b, nums, n, n, list );
int[] newNums = new int[list.size()];
for(int i=0;i<list.size();i++){
newNums[i] = list.get( i);
}
LCS(newNums,list);
need++;
}
} //输入分片
public static int[] getSplits( String str, String pattern ) {
String[] splits = str.split( pattern );
int[] ret = new int[ splits.length ];
for( int i = 0; i < ret.length; i++ ) {
ret[ i ] = Integer.parseInt( String.valueOf( splits[ i ] ) );
}
return ret;
}
//回溯输出最长序列。
public static void printLCS( int[][] b, int[] nums, int i, int j,List<Integer> list) {
if( i == 0 || j == 0 )
return;
else if( b[ i ][ j ] == 0 ) {
printLCS( b, nums, i - 1, j - 1,list );
list.remove( new Integer(nums[i-1]) );
} else if( b[ i ][ j ] == -1 ) {
printLCS( b, nums, i - 1, j,list );
} else {
printLCS( b, nums, i, j - 1,list);
}
}
}

关于LCS算法的具体实现,自行百度啦,主要就是进行矩阵Dp,判断相等于不相等时候的选择大小。

[vijosP1303]导弹拦截(最长上升子序列转LCS)的更多相关文章

  1. 洛谷 - P1020 - 导弹拦截 - 最长上升子序列

    https://www.luogu.org/problemnew/show/P1020 终于搞明白了.根据某定理,最少需要的防御系统的数量就是最长上升子序列的数量. 呵呵手写二分果然功能很多,想清楚自 ...

  2. 最长公共子序列问题 (LCS)

    给定两个字符串S和T.求出这两个字符串最长的公共子序列的长度. 输入: n=4 m=4 s="abcd" t="becd" 输出: 3("bcd&qu ...

  3. 动态规划法(十)最长公共子序列(LCS)问题

    问题介绍   给定一个序列\(X=<x_1,x_2,....,x_m>\),另一个序列\(Z=<z_1,z_2,....,z_k>\)满足如下条件时称为X的子序列:存在一个严格 ...

  4. 动态规划经典——最长公共子序列问题 (LCS)和最长公共子串问题

    一.最长公共子序列问题(LCS问题) 给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子序列,并返回其长度.例如: A = "HelloWorld"    B = & ...

  5. 【Luogu P1439】最长公共子序列(LCS)

    Luogu P1439 令f[i][j]表示a的前i个元素与b的前j个元素的最长公共子序列 可以得到状态转移方程: if (a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; d ...

  6. 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)

    最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...

  7. 清橙 A1120 拦截导弹 -- 动态规划(最长上升子序列)

    题目地址:http://oj.tsinsen.com/A1120 问题描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但 ...

  8. VijosP1303 导弹拦截

    背景 实中编程者联盟为了培养技术精湛的后备人才,必须从基础题开始训练. 描述 某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度, ...

  9. 【线型DP模板】最上上升子序列(LIS),最长公共子序列(LCS),最长公共上升子序列(LCIS)

    BEGIN LIS: 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序 ...

随机推荐

  1. 部署statspack工具(二)之解决方案2

    解决方案二:在emp2的empno列上面创建索引,再执行share_pool_sql_1.sh脚本,查看sp报告 8.1在emp2的empno列上创建索引 sys@TESTDB12>create ...

  2. 有关extdelete恢复测试

    客户意外rm掉了数据文件,导致数据库无法打开,由于没有完整的备份和归档,需要使用别的方法,而客户又关闭了数据库,导致无法使用文件描述符恢复,就要使用linux上别的方法了,现记录使用extundele ...

  3. Android 创建Library Project(库项目)与引用操作

    由于在开发过程,为了实现未曾了解的某种效果与特定功能,而求助于网上优秀的开源项目,在使用过程中发现引用开源的Library Project(库项目),的确可以解决很多问题,而且也给出了一种思路,好的软 ...

  4. MyBatis 插入时返回自增主键

    XML <insert id="insert" parameterType="com.stone.model.Person"> <!-- se ...

  5. IM比较SipDroid/IMSDroid/CSipsimple/Linphone/Webrtc

    一) sipdroid1)架构sip协议栈使用JAVA实现,音频Codec使用skype的silk(Silk编解码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器 ...

  6. javascript实现页面滚屏效果

    当我们浏览网页的时候,时常会碰到可以滚动屏幕的炫酷网页,今天笔者对这一技术进行简单实现,效果不及读者理想中那般炫酷,主要针对滚屏的技术原理和思想进行分享和分析.本示例在页面右侧有五个数字标签,代表五个 ...

  7. MVC 怎么把string字符串转译成html格式

    Views层下:

  8. Atom 编辑器系列视频课程

    此课程为 Atom 编辑器系列课程,主要介绍了 Atom 的高效开发技巧以及必备插件. 课程列表 Atom编辑器系列课程 #1 - Atom简介 Atom编辑器系列课程 #2 - 设置简介 Atom编 ...

  9. Nancy简单实战之NancyMusicStore(三):完善商品信息与管理

    前言 上一篇,我们做了不少准备,并且还把我们NancyFx音乐商城的首页打造好了.这一篇主要是完善我们在首页的商品浏览问题和添加对商品的管理. 下面开始正题: 商品详情 首先是查看单个商品的详情: 先 ...

  10. 关于我的PP0.1聊天软件(客户端)

    登陆界面: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...