[线性DP]轮渡问题(LIS应用)
2016-07-26 08:23
309 查看
题目:
有一个国家被一条河划分为南北两部分,在南岸和北岸总共有n个城镇,每一城镇在对岸都有唯一的友好城镇。任何两个城镇都没有相同的友好城镇。每一对友好城镇都希望有一条航线来往,于是他们向政府提出了申请。由于河终年有雾,政府决定不允许有任两条航线交叉(如果两条航线交叉,将有很大机会撞船)。
你的任务是编写一个程序来帮政府官员决定他们应拨款兴建哪些航线以使得没有出现交叉的航线数量最多。
输入文件:
南北城市从左到右编号为1 – n(n≤5000);
第一行为n,以下n行每行两个数,表示友好的两个城市。
输出文件:
4
1 2
2 3
3 4
4 1
输出样例:
3
思路:
线性DP,状态转移方程:f[i] = max{ f[j] } + 1 (1 <= j < i);
最长不下降子序列(LIS)的简单应用
结构体对应着存两岸友好关系城市,排序,就变成了求最长不下降子序列问题
代码:
反思:
无
有一个国家被一条河划分为南北两部分,在南岸和北岸总共有n个城镇,每一城镇在对岸都有唯一的友好城镇。任何两个城镇都没有相同的友好城镇。每一对友好城镇都希望有一条航线来往,于是他们向政府提出了申请。由于河终年有雾,政府决定不允许有任两条航线交叉(如果两条航线交叉,将有很大机会撞船)。
你的任务是编写一个程序来帮政府官员决定他们应拨款兴建哪些航线以使得没有出现交叉的航线数量最多。
输入文件:
南北城市从左到右编号为1 – n(n≤5000);
第一行为n,以下n行每行两个数,表示友好的两个城市。
输出文件:
4
1 2
2 3
3 4
4 1
输出样例:
3
思路:
线性DP,状态转移方程:f[i] = max{ f[j] } + 1 (1 <= j < i);
最长不下降子序列(LIS)的简单应用
结构体对应着存两岸友好关系城市,排序,就变成了求最长不下降子序列问题
代码:
#include <iostream> #include <stdio.h> #include <algorithm> #include <map> #include <vector> using namespace std; /* f[i] = max{f[j]} +1 (1 <= j < i); 最长不下降子序列的应用 */ const int N = 5000 + 10; int f ; int maxn; int n; struct node{ int left; int right; }e ; int cmp(node a, node b) { return a.left < b.right; } void LIS(node *e, int n) { for(int i = 0; i < n; i++) { f[i] = 1; for(int j = 0; j < i; j++) if(e[j].right < e[i].right && f[j]+1 > f[i]) f[i] = f[j] + 1; } } int main() { int maxn = 0; scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d%d", &e[i].left, &e[i].right); sort(e, e+n, cmp);//按照左岸的城市编号由小到大排序 LIS(e, n); for(int i = 0; i < n; i++) { if(f[i] > maxn) maxn = f[i]; } printf("%d", maxn); return 0; } /* 4 1 2 2 3 3 4 4 1 --------- 3 */
反思:
无
相关文章推荐
- Flash芯片的种类与区别
- Java中JVM的内存区域划分
- hadoop2.7.0升级到2.7.1,版本升级
- RS422接口标准、硬件电路
- hadoop2升级的那点事情(详解)
- RS485接口标准、硬件电路
- Hadoop升级方案(二):从Hadoop 1.0升级到2.0(1)
- Chrome 控制台console的用法
- Bingo和木棍(找不到出处)(优先队列)
- POJ 2718
- ssh自动认证
- LinQ中合并、连接、相交、与非查询
- HDOJ 1896 Stones (踢石头,优先队列)
- IOS懒加载不调用问题解决方案
- Bestcoder Round #84
- springmvc注解
- 如何正确使用 Django Forms
- FatMouse' Trade
- 【ssm整合教程】spring4.0.2+springMVC4.0.2+mybatis3.2.6集成
- Mybatis的一对多,多对一以及延迟加载