标签:scan The color under line ext turn its can
一道典型的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\n",ca++,height); } return 0; }
The Tower of Babylon UVA - 437
标签:scan The color under line ext turn its can
原文地址:https://www.cnblogs.com/baihualiaoluan/p/12287752.html