堆箱子

来源:互联网 发布:淘宝上手游充值赚钱不 编辑:程序博客网 时间:2024/05/20 21:20

题目描述

有一堆箱子,每个箱子宽为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;            }};

0 0