有一堆箱子,每个箱子宽为wi,长为di,高为hi,现在需要将箱子都堆起来,而且为了使堆起来的箱子不到,上面的箱子的宽度和长度必须小于下面的箱子。请实现一个方法,求出能堆出的最高的高度,这里的高度即堆起来的所有箱子的高度之和。
给定三个int数组w,l,h,分别表示每个箱子宽、长和高,同时给定箱子的数目n。请返回能堆成的最高的高度。保证n小于等于500。
测试样例:
[1,1,1],[1,1,1],[1,1,1]
返回:1
解题
按照上面一题的思路,还是要先排序
排序后找到,w l的 子序列对应的 h的最大值
import java.util.*;
public class Box {
public int getHeight(int[] w, int[] l, int[] h, int n) {
// write code here
// 根据 w 排序
for(int i=n-1;i>=0;i--){
for(int j=0;j< i;j++){
if(w[j] < w[j+1]){
swap(w,j,j+1);
swap(l,j,j+1);
swap(h,j,j+1);
}
}
}
// 两个判断条件 w l
int[] maxH = new int[n];
maxH[0] = h[0];
int res = maxH[0];
for(int i = 1; i < n; i++){
maxH[i] = h[i]; // 默认值
int tmax = 0;
for(int j = i-1; j >=0; j--){
if(w[j] > w[i] && l[j] > l[i]){
tmax = (tmax > maxH[j])? tmax : maxH[j];
}
}
maxH[i] += tmax;
res = res > maxH[i] ? res : maxH[i];
}
return res;
}
public void swap(int[] A,int i,int j){
int t = A[i];
A[i] = A[j];
A[j] = t;
}
}