题目链接: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

相关文章:

  • 2021-12-26
  • 2021-06-24
  • 2021-09-09
  • 2022-12-23
  • 2022-01-11
  • 2021-05-10
  • 2021-05-12
猜你喜欢
  • 2021-08-22
  • 2022-12-23
  • 2021-07-15
  • 2021-07-01
  • 2021-11-14
  • 2021-09-20
  • 2021-11-09
相关资源
相似解决方案