hdu1069: http://acm.hdu.edu.cn/showproblem.php?pid=1069
题意:用长方体叠梯子,大的放下面,小的放上面,求最高高度
解法:排序+枚举+dp:先按面积大小将所有长方体进行排序,再枚举放在上面和下面的长方体,用v[i].ah表示以i为底的小梯子的高度,则v[i].ah+=max(v[j].ah)(0<=j<i),表示原来的梯子叠上以j为底的梯子的高度,最后再去最大值。
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct area
{
int ac,ak,ah;
}v[50*3];
bool cmp(area x,area y)
{
return (x.ac*x.ak)<(y.ac*y.ak);
}
int main()
{
int n,a,b,c,t,max,cout=0;
while(1)
{
scanf("%d",&n);
if(n==0)break;
cout++;t=0;
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
v[t].ac=a;v[t].ak=b;v[t++].ah=c;
v[t].ac=b;v[t].ak=c;v[t++].ah=a;
v[t].ac=c;v[t].ak=a;v[t++].ah=b;
}
sort(v,v+t,cmp); //对面积从小到大排序,使前面的长方体一定得放在上面或者不能放
for(int i=1;i<t;i++) //枚举放在下面的长方体
{
max=0;
for(int j=0;j<i;j++) //枚举放在上面的长方体
{
if((v[i].ac>v[j].ac&&v[i].ak>v[j].ak||v[i].ac>v[j].ak&&v[i].ak>v[j].ac)&&v[j].ah>max) //找出可以放在i上面的所有长方体中高最大的
max=v[j].ah;
}
v[i].ah+=max; //v[i].ah表示以i为底叠成的梯子的最大高度
}
max=0;
for(int i=0;i<t;i++)
{
if(v[i].ah>max)
max=v[i].ah;
}
printf("Case %d: maximum height = %d\n",cout,max);
}
}
/*input:
1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0
output:
Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342
*/