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