zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    pandas 之 数据合并
    第一册:lesson sixty five.
    第一册:lesson sixty three。
    C#正则表达式。
    第一册:lesson sixty one.
    C#泛型。
    SQL命令入门。
    C#序列化与反序列化。
    第一册:lesson fifty nine。
    C#文件操作。
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5978184.html
Copyright © 2011-2022 走看看