您的位置:首页 > 其它

uva 437——The Tower of Babylon

2015-11-24 22:07 453 查看
题意:给定n个长方体,然后堆积最高的塔,要求上面的面积小于下面的面积。

思路:Dp,先把长方体的所有放的情况都构造出来放到数组里,对于当前节点,如果能够在前面找到面积比当前小,高度累加比当前高的则转移状态。

code:

#include <bits/stdc++.h>
using namespace std;

#define ft(i,s,t) for(int i=s;i<=t;i++)

const int N=95;
struct node
{
int x,y,h;
}g
;
int dp
,v[3];

bool cmp(node a,node b){
if (a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
int main()
{
int n,ca=1;
while(~scanf("%d",&n),n)
{
int l=0;
ft(j,0,n-1){
ft(i,0,2) scanf("%d",&v[i]);
sort(v,v+3);
ft(i,0,2)
{
g[l+i].h=v[(0+i)%3];
g[l+i].x=v[(2+i)%3];
g[l+i].y=v[(1+i)%3];
}
swap(g[l+1].x,g[l+1].y);
l+=3;
}

sort (g,g+l,cmp);
int ans=0;
ft(i,0,l-1)
{
dp[i]=g[i].h;
for (int j=0;j<i;j++)
{
if (g[j].x<g[i].x&&g[j].y<g[i].y&&dp[i]<dp[j]+g[i].h)
dp[i]=dp[j]+g[i].h;
}
ans=max(ans,dp[i]);
}
printf("Case %d: maximum height = %d\n",ca++,ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息