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
",cases++,ans);

    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/TreeDream/p/5978184.html