The Tower of Babylon UVA - 437 DAG上的动态规划

题目:题目链接

思路:每个方块可以用任意多次,但因为底面限制,每个方块每个放置方式选一个就够了,以x y为底 z 为高,以x z为底 y 为高,以y z为底 x为高,因为数据量很小,完全可以把每一种当成DAG上的一个结点,然后建图找最长路径。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cstring>
 6 #include <string>
 7 #include <vector>
 8 #include <map>
 9 #include <set>
10 #include <queue>
11 #include <deque>
12 #include <stack>
13 #include <list>
14
15 #define FRER() freopen("in.txt", "r", stdin)
16 #define FREW() freopen("out.txt", "w", stdout)
17
18 #define INF 0x3f3f3f3f
19
20 using namespace std;
21
22 struct block {
23     int x, y, z;
24     block() {}
25     block(int x, int y, int z):x(x), y(y), z(z) {}
26     bool operator < (const block & other) const {
27         return (x < other.x && y < other.y) || (x < other.y && y < other.x);
28     }
29 };
30
31 vector<block> vec;
32
33 int n, m, d[100];
34 bool G[100][100];
35
36 void init() {
37     vec.clear();
38     int x, y, z;
39     for(int i = 0; i < n; ++i) {
40         cin >> x >> y >> z;
41         vec.push_back(block(x, y, z));
42         vec.push_back(block(x, z, y));
43         vec.push_back(block(y, z, x));
44     }
45     m = n * 3;
46     memset(G, 0, sizeof(G));
47     for(int i = 0; i < m; ++i)
48         for(int j = 0; j < m; ++j)
49             if(vec[i] < vec[j])
50                 G[i][j] = 1;
51
52     memset(d, 0, sizeof(d));
53 }
54
55 int dp(int i, int h) {
56     if(d[i]) return d[i];
57     int& ans = d[i];
58     ans = h;
59     m = n * 3;
60     for(int j = 0; j < m; ++j) {
61         if(G[i][j])
62             ans = max(ans, dp(j, vec[j].z) + h);
63     }
64     return ans;
65 }
66
67
68 int solve() {
69     int ans = -1;
70     for(int i = 0; i < m; ++i)
71         ans = max(ans, dp(i, vec[i].z));
72     return ans;
73 }
74
75 int main()
76 {
77     //FRER();
78     //FREW();
79     ios::sync_with_stdio(0);
80     cin.tie(0);
81
82     int kase = 0;
83     while(cin >> n, n) {
84         init();
85         cout << "Case " << ++kase << ": maximum height = " << solve() << endl;
86     }
87
88     return 0;
89 }

原文地址:https://www.cnblogs.com/fan-jiaming/p/9944672.html

时间: 2024-08-06 19:48:36

The Tower of Babylon UVA - 437 DAG上的动态规划的相关文章

The Tower of Babylon(UVa 437)

题意:有n种立方体,每种都有无穷多个.选一些正方体摞成一根尽量高的柱子(可以选择任意一条边做高),使得每个立方体的底面长宽分别严格小于它下方的立方柱的底面长宽. 题解:可以套用DAG最长路算法,可以使用二元组来表示每个立方体的每一条边,如v[n][2]就可以用来表示第n个立方块的3个边. DAG最长路算法: int dp(int i,int j) { int &ans=dist[i][j]; if(ans>0) return ans;///表示已经查找过此种状态 ans=0;///根据题意赋

UVa 103 Stacking Boxes --- DAG上的动态规划

UVa 103 题目大意:给定n个箱子,每个箱子有m个维度, 一个箱子可以嵌套在另一个箱子中当且仅当该箱子的所有的维度大小全部小于另一个箱子的相应维度, (注意箱子可以旋转,即箱子维度可以互换),求最多能套几个箱子. 第一行输入为n,m,之后是n行m维的箱子 解题思路:嵌套关系是二元关系,因此这题即在DAG上做动态规划, 只不过将二维的判断改成了n维,其他不变. 详细看考:DAG上的动态规划之嵌套矩形  (ps:这题可以理解成嵌套m边形) /* UVa 103 Stacking Boxes --

Monkey and Banana(DAG上的动态规划问题)

Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8122    Accepted Submission(s): 4194 Problem Description A group of researchers are designing an experiment to test the IQ of a

ACM:DAG上的动态规划------硬币问题

ExecutorService 建立多线程线程池的步骤: 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量,其他线程排队等候.一个任务执行完毕,再从队列的中取最前面的任务开始执行.若队列中没有等待进程,线程池的这一资源处于等待.当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了:否则进入等待队列. 为什么要用线程池: 1.减少了创建和

嵌套矩形——DAG上的动态规划

有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 题目描述: 有n个矩形,每个矩形可以用两个整数a,b描述,表示它的长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d,或者b<c,a<d(相当于把矩形X旋转90°).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)内.你的任务是选出尽可能多的矩形排成一行.使得除了最后一个之外,每个矩形都

DP入门(2)——DAG上的动态规划

有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 一.DAG模型 [嵌套矩形问题] 问题:有n个矩形,每个矩形可以用两个整数a.b描述,表示它的长和宽.矩形X(a , b)可以嵌套在矩形Y(c , d)中当且仅当a<c,b<d,或者b<c,a<d(相当于把矩形X旋转90°).例如(1,5)可以嵌套在(6, 2)内,但不能嵌套在(3, 4)内.你的任务是选出尽可能多的矩形排

[USACO][DAG上的动态规划]Sorting A Three-Valued Sequence

好美的图论,真的 light up my life!题意: 给出一个只含有若干1,2,3的数列,我们可以两两交换数列元素:要求输出让这个数列不减的最小交换次数. 思路: 首先看起来很像冒泡.....然鹅要最少交换次数——显然不是模拟冒泡了. 开始用深搜来着,显然没办法剪枝,果断T掉.这个时候就要想一想图论了. 想起来leetcode周赛的1247这道题.题目说的是有两个在{x,y}上相同长度的字符串,我们可以在两个字符串之间任选字符交换.求第一个字符串变成第二个字符串所需要的最小交换次数,有一点

DAG上的动态规划

UVA1025 分析:因为时间是单向流逝的,是天然的"序",所以影响决策的只有当前时间和所处的决策.dp[i][j],表示在第i分钟时,处于第j个车站,最少还需要多少等待时间,因此其等待时间就有站原地等待,乘坐从左到右的车,乘坐从右到左的车,三个状态来决定. 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "strin

UVA437-The Tower of Babylon(动态规划基础)

Problem UVA437-The Tower of Babylon Accept: 3648  Submit: 12532Time Limit: 3000 mSec Problem Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line with the ed