您的位置:首页 > 其它

UVa 437 - The Tower of Babylon

2012-04-04 14:59 423 查看
和之前的 Stacking Boxes 很像,但是这里求的是最大高度,并且盒子成了立体状,因此对每个盒子有三种不同的高度,分别为x, y, z,相当于增加两个盒子;

记忆化搜索。

# include <stdio.h>
# include <memory.h>

typedef struct {
int x;
int y;
int h;
}block;

int n;
int f[91];
block b[91];

int cmp(const void *x, const void *y)
{
return (*(int *)x > *(int *)y ? 1:-1);
}

int dp(int i);

int main()
{
int i, cnt, maxH, tmp, t[3];

cnt = 0;
while (1)
{
++cnt;
scanf("%d", &n);
if ( !n ) break;
n *= 3;
for ( i = 1; i <= n; ++i)
{
scanf("%d%d%d", &t[0], &t[1], &t[2]);
qsort(t, 3, sizeof(int), cmp);
b[i].x = t[0]; b[i].y = t[1]; b[i].h = t[2]; ++i;
b[i].x = t[0]; b[i].y = t[2]; b[i].h = t[1]; ++i;
b[i].x = t[1]; b[i].y = t[2]; b[i].h = t[0];
}

maxH = 0;
memset(f, 0, sizeof(f));
for ( i = 1; i <= n; ++i)
if (maxH < (tmp = dp(i))) maxH = tmp;

printf("Case %d: maximum height = %d\n", cnt, maxH);
}

return 0;
}

int dp(int i)
{
int j, tmp;

if (f[i] > 0) return f[i];
f[i] = b[i].h;
for ( j = 1; j <= n; ++j)
{
if (b[i].x>b[j].x && b[i].y>b[j].y && f[i] < (tmp = dp(j)+b[i].h))
f[i] = tmp;
}

return f[i];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: