码迷,mamicode.com
首页 > 其他好文 > 详细

uva 437,巴比伦塔

时间:2016-10-19 19:44:23      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

题目链接: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,巴比伦塔

标签:

原文地址:http://www.cnblogs.com/TreeDream/p/5978184.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!