首页 > 代码库 > 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;}
View Code

 

uva 437,巴比伦塔