您的位置:首页 > 其它

hdu 1069 Monkey and Banana (dp)

2015-10-28 20:04 302 查看
题目链接:

题意:把给定尺寸的长方体(数量不限)叠加在一起,叠加的条件是,上面一个长方体的长和宽比下面长方体的长和宽短,不能相等,长方体可以任意面朝下摆放,求这些长方体能叠加的最高的高度。

把每个长方体分成3个元素。然后就和矩形嵌套差不多了,排序之后求容量最大的子序列。

代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <ctype.h>
#include <iomanip>
#include <queue>
#include <stdlib.h>
using namespace std;

struct node
{
int x,y,h;
}f[10100];

int cmp(node a,node b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}

int main()
{
int i,j,t,n,MAX,max1;
int a,b,c,p=1;
while(cin>>n&&n){
t=0;
for(i=0;i<n;i++){
cin>>a>>b>>c;
f[t].x=a,f[t].y=b,f[t++].h=c;
f[t].x=b,f[t].y=a,f[t++].h=c;
f[t].x=a,f[t].y=c,f[t++].h=b;
f[t].x=c,f[t].y=a,f[t++].h=b;
f[t].x=c,f[t].y=b,f[t++].h=a;
f[t].x=b,f[t].y=c,f[t++].h=a;
}
sort(f,f+t,cmp);
max1=f[0].h;
for(i=1;i<t;i++){
MAX=0;
for(j=0;j<t;j++)
if((f[i].x>f[j].x&&f[i].y>f[j].y)||(f[i].y>f[j].x&&f[i].x>f[j].y))
MAX=max(MAX,f[j].h);
f[i].h+=MAX;
max1=max(max1,f[i].h);
}
printf("Case %d: maximum height = %d\n",p++,max1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: