The Tower of Babylon UVA - 437
Posted baihualiaoluan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The Tower of Babylon UVA - 437相关的知识,希望对你有一定的参考价值。
题面:https://vjudge.net/problem/UVA-437
思路:
一道典型的DAG上进行记忆化搜索的题。
本题的数据范围非常小,可以把每个立方体当作三个高不同的立方体。假若第i个立方体能放在第j个立方体上,就在i-j之间连上一条边。最后枚举起点进行记忆化搜索即可。
代码:
#include <bits/stdc++.h> using namespace std; struct Cube { int a,b,c; Cube(int _a = 0,int _b =0,int _c= 0):a(_a),b(_b),c(_c){}; }; Cube cu[100]; int d[100]; int G[100][100]; void have_edge(int a,int b) { if((cu[a].a>cu[b].a&&cu[a].b>cu[b].b)||(cu[a].b>cu[b].a&&cu[a].a>cu[b].b)) G[a][b] = 1; }int n; int dp(int i) { int &ans = d[i]; if(ans>0) return ans; ans = cu[i].c; for(int j = 0;j<3*n;++j) { if(G[i][j]) ans = max(ans,cu[i].c+dp(j)); } return ans; } int main() { int ca = 1; while(scanf("%d",&n)&&n) { int a,b,c; int height = 0; memset(d,0,sizeof(d)); memset(G,0,sizeof(G)); for(int i = 0;i<n;++i) { scanf("%d %d %d",&a,&b,&c); cu[3*i] = Cube(a,b,c); cu[3*i+1] =Cube(a,c,b); cu[3*i+2] = Cube(b,c,a); } for(int i = 0;i<3*n;++i) { for(int j = 0;j<3*n;++j) have_edge(i,j); } for(int i = 0;i<3*n;++i) d[i] = dp(i); for(int i = 0;i<3*n;++i) height = max(height,d[i]); printf("Case %d: maximum height = %d ",ca++,height); } return 0; }
以上是关于The Tower of Babylon UVA - 437的主要内容,如果未能解决你的问题,请参考以下文章
UVA437-The Tower of Babylon(动态规划基础)