#include<cstring>
#include<stdio.h>
#include<iostream>
#include <algorithm>
using namespace std;
#define MAX 105
int n;
int block[MAX][3];
int d[MAX][3];
void get_(int *v, int id, int k)
{
int cnt = 0;
for (int i = 0;i != 3;++i)
{
if (i == k)
continue;
v[cnt++] = block[id][i];
}
}
int dp(int id, int k)
{
if (d[id][k] > 0)
return d[id][k];
d[id][k] = 0;
int v1[2], v2[2];
get_(v1, id, k);
//计算编号id,高的编号为k的立方体作底上面最多可以放多高----d[id][k]
for (int i = 0;i != n;++i)
for (int j = 0;j != 3;++j)
{
get_(v2, i, j);
if (v1[0] > v2[0] && v1[1] > v2[1])
d[id][k] = max(d[id][k], dp(i, j));
}
d[id][k] += block[id][k];//加上自身高度
return d[id][k];
}
int main()
{
int casecnt = 0;
while (cin >> n && n)
{
for (int i = 0;i != n;++i)
{
cin >> block[i][0] >> block[i][1] >> block[i][2];
sort(block[i], block[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", ++casecnt, ans);
}
return 0;
}
UVA 437 DAG最长路
最新推荐文章于 2024-09-21 14:48:47 发布