动态规划——背包、LIS、LCS

问题 A: 导弹拦截

时间限制: 1 Sec  内存限制: 128 MB

题目描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意 的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所 有的导弹。
输入导弹一次飞来的高度(雷达给出的高度不大于30000的正整数)。计算这套系统最多能拦截多少导弹。

输入

n颗依次飞来的导弹高度,导弹颗数<=1000。

输出

一套系统最多拦截的导弹数。

样例输入

7

300 250 275 252 200 138 245

样例输出

5

提示

这题是一道裸的LIS,

f(n)表示1~n内最多拦截的导弹数。

有:f(n)=Max(f[i]+1)(i<n && a[i]>=a[j])

f值相等的我们只用保留a值最小的,再二分查找即可。

问题 B: 友好城市

时间限制: 1 Sec  内存限制: 128 MB

题目描述

Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置不同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。
每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府作出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。

输入

第1行,一个整数N(1<=N<=50000,表示城市数。
第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和北岸的一对友好城市的左边。(0<=xi<=10000)

输出

仅一行,输出一个整数,政府所能批准的最多申请书。

样例输入

7

22 4

2 6

10 3

15 12

9 8

17 17

4 2

样例输出

4

提示

题目中说不能相交,所以可以先将一维排序,在比较另一维,

然后我们就见到了熟悉的东西——LIS.

问题 C: 0/1背包

时间限制: 1 Sec  内存限制: 128 MB

题目描述

一个旅行者有一个最多能装m公斤物品的背包,现在有n件物品,它们的重量分别是w1,w2,…,wn,它们的价值分别为c1,c2,…,cn。若每件物品只有一件,求旅行者能获得的最大总价值。

输入

第一行:两个整数,m(背包容量,m<=200)和n(物品数量,n<=30)。
第二~n+1行:每行两个整数wi,ci,表示每个物品的重量和价值。

输出

一个数据,表示最大总价值。

样例输入

10 4

2 1

3 3

4 5

7 9

样例输出

12

提示

只是最初始的背包问题。

f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。

f[i][v]=max(f[i-1][v],f[i-1][v-Ci]+Wi);

而每次主循环中以v的递减顺序计算 f[v],这样才

能保证计算f[v]时f[v-Ci]保存的是状态f[i-1][v-Ci]的值。

时间: 2024-10-05 10:14:34

动态规划——背包、LIS、LCS的相关文章

LIS/LCS/LCIS

1.最长上升子序列 2.最长公共子序列 对于两个序列X={x1,x2,x3...xi ...},Y={y1,y2,y3... yi...} 3.最长上升公共子序列 以下摘自刘汝佳<最长公共上升子序列(LCIS)的O(n^2)算法> 预备知识:动态规划的基本思想,LCS,LIS. 问题:字符串a,字符串b,求a和b的LCIS(最长公共上升子序列). 首先我们可以看到,这个问题具有相当多的重叠子问题.于是我们想到用DP搞.DP的首要任务是什么?定义状态. 定义状态F[i][j]表示以a串的前i个字

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种

最长上升子序列 CSU - 1047 ( LIS LCS )

名词解释: 一串数字比如1.5.3.6.9.8.10,它的子序列是从左到右不连续的若干个数,比如1.5.6,3.9.8.10都是它的子序列. 最长上升子序列即从左到右严格增长的最长的一个子序列,1.5.6.9.10就是这个序列的一个最长上升子序列. 给出若干序列,求出每个序列的最长上升子序列长度. Input 多组数据,每组第一行正整数n,1 <= n <= 1000,第二行n个空格隔开的不大于1,000,000的正整数. Output 每组数据输出一行,最长上升子序列的长度. Sample

动态规划之LIS

这几天看了不少讲动态规划的书和文章,一般第一个例子就是斐波那契.这个例子真直观,可以将递归发,然后讲自顶向下,自底向上,都没问题. 动态规划还好嘛,not so hard. 但是,从第二个问题开始就不那么直观了. 最喜欢被人用的第二个例子就是这个LIS Longest increasing sequence. 从一个序列里找出最长的升序子序列的长度: 比如:10,22,9,33,21,50,41,60,80 这个数字序列的最长生升序子序列是10 22 33 50 60 80 , 长度是6.最长升

bzoj1264 基因匹配Match (lcs转lis lcs(nlogn))

基因匹配Match 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目描述 基因匹配(match) 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球上只有4种),而更奇怪的是,组成 DNA序列的每一种碱基在该序列中正好出现5次!这样如果一个DNA序列有N种不同的碱基构成,那么它的长度一定是5N. 卡卡醒来后向可可叙述了这个奇怪的梦,而可 可这些日子正在研究生物信息学中的基因匹配问题,于是他决定为这个奇怪星球上的生物写一个简单

动态规划——背包

Wikioi 3729 飞扬的小鸟 题目描述 Description 输入描述 Input Description 输出描述 Output Description 输出文件名为 bird.out. 共两行. 第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0. 第二行,包含一个整数,如果第一行为 1,则输出成功完成游戏需要最少点击屏幕数, 否则,输出小鸟最多可以通过多少个管道缝隙. 样例输入 Sample Input 样例输出 Sample Output [输入输出样例说明]

动态规划——E (LIS())最长上升子序列

E - LIS Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description The world financial crisis is quite a subject. Some people are more relaxed while others are quite anxious. John is one of them. He is very

LIS &amp;&amp; LCS &amp;&amp; LCIS模板

1. LIS O (n^2): /* LIS(Longest Increasing Subsequence) 最长上升子序列 O (n ^ 2) 状态转移方程:dp[i] = max (dp[j]) + 1 (a[j] < a[i],1 <= j < i) 附带有print输出路径函数 */ void LIS(void) { int ret = 0, last = 0; for (int i=1; i<=n; ++i) { dp[i] = 1; fa[i] = -1; for (i

【洛谷】【动态规划/背包】P1833 樱花

[题目描述:] 爱与愁大神后院里种了n棵樱花树,每棵都有美学值Ci.爱与愁大神在每天上学前都会来赏花.爱与愁大神可是生物学霸,他懂得如何欣赏樱花:一种樱花树看一遍过,一种樱花树最多看Ai遍,一种樱花树可以看无数遍.但是看每棵樱花树都有一定的时间Ti.爱与愁大神离去上学的时间只剩下一小会儿了.求解看哪几棵樱花树能使美学值最高且爱与愁大神能准时(或提早)去上学. [输入格式:] 共n+1行: 第1行:三个数:现在时间Ts(几点:几分),去上学的时间Te(几点:几分),爱与愁大神院子里有几棵樱花树n.