uva 437,巴比伦塔

时间:2021-06-19 21:51:20

题目链接: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[][];
int d[][];
int n; void get_dimensions(int *v,int b,int dim) {
int idx = ;
for(int i=;i<;i++) {
if(i!=dim)
v[idx++] = blocks[b][i];
}
} int dp(int i,int j)
{
int& ans = d[i][j];
if(ans>) return ans; ans = ;
int v[],v2[];
get_dimensions(v,i,j);
for(int a=;a<n;a++) {
for(int b=;b<;b++) {
get_dimensions(v2,a,b);
if(v2[]<v[]&&v2[]<v[])
ans = max(ans,dp(a,b));
}
}
ans+=blocks[i][j];
return ans;
} int main()
{
int cases = ;
while(scanf("%d",&n),n) {
for(int i=;i<n;i++) {
for(int j=;j<;j++) {
scanf("%d",&blocks[i][j]);
}
sort(blocks[i],blocks[i]+);
} memset(d,,sizeof(d)); int ans = ; for(int i=;i<n;i++) {
for(int j=;j<;j++) {
ans = max(ans,dp(i,j));
}
} printf("Case %d: maximum height = %d\n",cases++,ans); }
return ;
}