首页 > 代码库 > uva 437,巴比伦塔
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,巴比伦塔
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。