首页 > 代码库 > 动态规划——背包、LIS、LCS

动态规划——背包、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值最小的,再二分查找即可。

技术分享View Code

问题 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.

技术分享View Code

问题 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]的值。

技术分享View Code

 

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