UVA - 10131Is Bigger Smarter?(DAG上的DP)
题目:UVA - 10131Is Bigger Smarter?
(DAG)
题目大意:给出一群大象的体重和IQ。要求挑选最多的大象,组成一个序列。严格的体重递增,IQ递减的序列。输出最多的大象数目和这些大象的序列(当中一种就能够)。
解题思路:DAG上的DP。和之前的一篇相似。uva437 - The Tower of Babylon(DAG上的DP)。就是将每两仅仅大象满足上面的序列要求的形成一条有向边。
之后就是DAG上的DP。然后再路径输出。
代码:
#include <cstdio>
#include <cstring> const int N = 1005; int elephants[N][2];
int d[N][N];
int G[N][N];
int n; void init () { memset (d, -1, sizeof (d));
} void handle () { memset (G, 0, sizeof (G));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) { if (i == j)
continue;
if (elephants[i][0] < elephants[j][0] && elephants[i][1] > elephants[j][1])
G[i][j] = 1;
}
} int Max (const int a, const int b) { return a > b? a: b; } int DP (int x, int y) { int& ans = d[x][y];
if (ans != -1)
return ans;
for (int i = 0; i < n; i++) { if (i == y)
continue;
if (G[y][i])
ans = Max (ans, DP(y, i) + 1);
} if (ans == -1)
ans = 2;
return ans;
} void printf_ans (int x, int y) { printf ("%d\n", x + 1);
if (d[x][y] == 2) { printf ("%d\n", y + 1);
return;
} for (int i = 0; i < n; i++) { if (i == y)
continue;
if (G[y][i] && d[x][y] == d[y][i] + 1) {
printf_ans (y, i);
break;
}
}
} int main () { n = 0;
while (scanf ("%d%d", &elephants[n][0], &elephants[n][1]) != EOF) { n++;
} handle();
init (); int ans, temp;
ans = -1;
int x, y;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) { if (G[i][j]) {
temp = DP(i, j);
if (temp > ans) { x = i;
y = j;
}
ans = Max (ans, temp);
}
} if (ans != -1) { printf ("%d\n", ans);
printf_ans (x, y);
} else
printf ("1\n1\n");
return 0;
}
UVA - 10131Is Bigger Smarter?(DAG上的DP)的更多相关文章
- UVa 103 Stacking Boxes --- DAG上的动态规划
UVa 103 题目大意:给定n个箱子,每个箱子有m个维度, 一个箱子可以嵌套在另一个箱子中当且仅当该箱子的所有的维度大小全部小于另一个箱子的相应维度, (注意箱子可以旋转,即箱子维度可以互换),求最 ...
- uva 10131 Is Bigger Smarter?(DAG最长路)
题目连接:10131 - Is Bigger Smarter? 题目大意:给出n只大象的属性, 包括重量w, 智商s, 现在要求找到一个连续的序列, 要求每只大象的重量比前一只的大, 智商却要小, 输 ...
- BZOJ 3998 TJOI2015 弦论 后缀自动机+DAG上的dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3998 题意概述:对于一个给定长度为N的字符串,求它的第K小子串是什么,T为0则表示不同位置 ...
- NYOJ16 矩形嵌套 【DAG上的DP/LIS】
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c ...
- DAG上的DP
引例:NYOJ16 矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可 ...
- UVA 10917 Walk Through the Forest(dijkstra+DAG上的dp)
用新模板阿姨了一天,换成原来的一遍就ac了= = 题意很重要..最关键的一句话是说:若走A->B这条边,必然是d[B]<d[A],d[]数组保存的是各点到终点的最短路. 所以先做dij,由 ...
- UVA 11324 The Largest Clique(缩点+DAG上的dp)
求最大团.和等价性证明有类似之处,只不过这个不是求互推,而是只要a->b,或b->a即可. 同样的,容易想到先缩点,得到DAG,每个节点上保存SCC的点数,相信任意一条由根节点(入度为零) ...
- UVA 437 巴比伦塔 【DAG上DP/LIS变形】
[链接]:https://cn.vjudge.net/problem/UVA-437 [题意]:给你n个立方体,让你以长宽为底,一个个搭起来(下面的立方体的长和宽必须大于上面的长和宽)求能得到的最长高 ...
- uva 437 巴比伦塔(DAG上dp)
巴比伦塔 紫书P269 看完紫书,终于可以自己写一个dp了 :) [题目链接]巴比伦塔 [题目类型]DAG上dp &题意: 有n种立方体 n<=30,每种有无穷个,要求选一些立方体摞成一 ...
随机推荐
- Java根据年份算出所属的生肖。
一个小程序~ public String getYear(Integer year){ if(year<1900){ return "未知"; } Integer start ...
- hdu1556 Color the ball
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- 认识Junit
JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个. JUnit有它自己的JUn ...
- iOS 实时监听app的网络连接状态
实际iOS开发中,在网络通信中我们大部分使用第三方(只谈短链),譬如 AFNetworking.ASIHttpRequest(这个停更了,想必现在没多少人用),swift的 Alamofire 等. ...
- for、foreach和MoveNext循环效率粗比较
今天没事对for循环.foreach循环.MoveNext循环,执行效率进行了对比:粗略测试代码如下: static void Main(string[] args) { #region 三种方式循环 ...
- uva 714 - Copying Books(贪心 最大值最小化 二分)
题目描写叙述开头一大堆屁话,我还细致看了半天..事实上就最后2句管用.意思就是给出n本书然后要分成k份,每份总页数的最大值要最小.问你分配方案,假设最小值同样情况下有多种分配方案,输出前面份数小的,就 ...
- 背包问题递归java
public boolean PackageProblem(int[] arr,int start,int targetLeft,int target) { if(arr.length==0) { S ...
- 基本的 html 代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ajax 分页完全代码整理
/* ajax分页 */ var page_cur = 1; //当前页 var total_num, page_size, page_total_num;//总记录数,每页条数,总页数 functi ...
- [Math]Sqrt(x)
Total Accepted: 75767 Total Submissions: 314003 Difficulty: Medium Implement int sqrt(int x). Comput ...