题目描述:
有一堆箱子,每个箱子宽为wi,长为di,高为hi,现在需要将箱子都堆起来,而且为了使堆起来的箱子不到,上面的箱子的宽度和长度必须大于下面的箱子。请实现一个方法,求出能堆出的最高的高度,这里的高度即堆起来的所有箱子的高度之和。
给定三个int数组w,l,h,分别表示每个箱子宽、长和高,同时给定箱子的数目n。请返回能堆成的最高的高度。保证n小于等于500。
测试样例:
[1,1,1],[1,1,1],[1,1,1]
返回:1
思路:采用动态规划。先按照宽度排序,再根据长度求最长升序子序列,记录高度和。
class Box {
private:
struct box{
int weight;
int length;
int height;
box(int w,int l,int h):weight(w),length(l),height(h){}
};
static bool bcmp(const box box1,const box box2){//这里一定要是静态
return box1.weight<=box2.weight;
}
public:
int getHeight(vector<int> w, vector<int> l, vector<int> h, int n) {
// write code here
vector<box> boxes;
for(int i=0;i<n;i++){
box b(w[i],l[i],h[i]);
boxes.push_back(b);
}
sort(boxes.begin(),boxes.end(),bcmp);
vector<int> record(n);
int maxh=0;
for(int i=0;i<n;i++){
record[i]=boxes[i].height;
//int temp=0;
for(int j=0;j<i;j++)
{
//要有第一个条件 防止宽度相等的情况
if(boxes[j].weight<boxes[i].weight&&boxes[j].length<boxes[i].length
&&record[j]+boxes[i].height>record[i])
record[i]=record[j]+boxes[i].height;
}
maxh=max(maxh,record[i]);
}
return maxh;
}
};