uva 437,巴比伦塔
Posted 树的种子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva 437,巴比伦塔相关的知识,希望对你有一定的参考价值。
题目链接:https://uva.onlinejudge.org/external/4/437.pdf
题意:巴比伦塔:
给出n种立方体,一个立方体能放到另一个立方体上,必须满足,底面一定要小于下面的立方体。求巴比伦塔最多堆多高?
分析:
DAG很容易想到,主要是状态的描叙。
一个立方体,他有3种情况,状态的描叙就用dp[id][3],此时dp[][i] I 来记录哪个是高。
#include <bits/stdc++.h> using namespace std; int blocks[35][3]; int d[35][3]; int n; void get_dimensions(int *v,int b,int dim) { int idx = 0; for(int i=0;i<3;i++) { if(i!=dim) v[idx++] = blocks[b][i]; } } int dp(int i,int j) { int& ans = d[i][j]; if(ans>0) return ans; ans = 0; int v[2],v2[2]; get_dimensions(v,i,j); for(int a=0;a<n;a++) { for(int b=0;b<3;b++) { get_dimensions(v2,a,b); if(v2[0]<v[0]&&v2[1]<v[1]) ans = max(ans,dp(a,b)); } } ans+=blocks[i][j]; return ans; } int main() { int cases = 1; while(scanf("%d",&n),n) { for(int i=0;i<n;i++) { for(int j=0;j<3;j++) { scanf("%d",&blocks[i][j]); } sort(blocks[i],blocks[i]+3); } memset(d,0,sizeof(d)); int ans = 0; for(int i=0;i<n;i++) { for(int j=0;j<3;j++) { ans = max(ans,dp(i,j)); } } printf("Case %d: maximum height = %d\\n",cases++,ans); } return 0; }
以上是关于uva 437,巴比伦塔的主要内容,如果未能解决你的问题,请参考以下文章