题目描述
有一堆箱子,每个箱子宽为wi,长为di,高为hi,现在需要将箱子都堆起来,而且为了使堆起来的箱子不到,上面的箱子的宽度和长度必须大于下面的箱子。请实现一个方法,求出能堆出的最高的高度,这里的高度即堆起来的所有箱子的高度之和。
给定三个int数组w,l,h,分别表示每个箱子宽、长和高,同时给定箱子的数目n。请返回能堆成的最高的高度。保证n小于等于500。
测试样例:
[1,1,1],[1,1,1],[1,1,1]
返回:1
class Box
{
public:
int getHeight(vector<int> w, vector<int> l, vector<int> h, int n)
{
// write code here
//参考了别人的代码
//类似于求一个数组的最大升序子序列,但是本题目中箱子的顺序(在满足约束条件的情况下)可以任意摆放
//因此,为了求出能堆成的最大高度,应先按照w或者l对箱子排序,保持箱子放置的相对顺序是最优的
if(n<=0)
return 0;
if(n==1)
return h[0];
//按照w进行由大到小排序
for(int i=1;i<w.size();i++)
{
for(int j=0;j<w.size()-i;j++)
{
if(w[j]>w[j+1])
{
swap(w[j],w[j+1]);
swap(l[j],l[j+1]);
swap(h[j],h[j+1]);
}
}
}
vector<int> height(n,0); //height[i]表示最后一个放第i+1个箱子时所能堆出的最大高度
height[0]=h[0];
int maxheight=h[0];
for(int i=1;i<n;i++)
{
height[i]=h[i];
for(int j=i-1;j>=0;j--)
{
if(w[i]>w[j]&&l[i]>l[j])
{
height[i]=max(height[i],h[i]+height[j]);
}
}
maxheight=max(maxheight,height[i]);
}
return maxheight;
}
};