-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMaxHeight.java
More file actions
76 lines (74 loc) · 3.12 KB
/
MaxHeight.java
File metadata and controls
76 lines (74 loc) · 3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package basic.dynamic;
import java.util.Arrays;
import java.util.Comparator;
/**
* leetcode1691 Maximum Height by Stacking Cuboids
* https://leetcode.com/problems/maximum-height-by-stacking-cuboids/
* 给你 n 个长方体 cuboids ,其中第 i 个长方体的长宽高表示为 cuboids[i] = [widthi, lengthi, heighti](下标从 0 开始)。请你从 cuboids 选出一个 子集 ,并将它们堆叠起来。
* <p>
* 如果 widthi <= widthj 且 lengthi <= lengthj 且 heighti <= heightj ,你就可以将长方体 i 堆叠在长方体 j 上。你可以通过旋转把长方体的长宽高重新排列,以将它放在另一个长方体上。
* <p>
* 返回 堆叠长方体 cuboids 可以得到的 最大高度 。
* 示例 1:
* 输入:cuboids = [[50,45,20],[95,37,53],[45,23,12]]
* 输出:190
* 解释:
* 第 1 个长方体放在底部,53x37 的一面朝下,高度为 95 。
* 第 0 个长方体放在中间,45x20 的一面朝下,高度为 50 。
* 第 2 个长方体放在上面,23x12 的一面朝下,高度为 45 。
* 总高度是 95 + 50 + 45 = 190 。
* 示例 2:
* <p>
* 输入:cuboids = [[38,25,45],[76,35,3]]
* 输出:76
* 解释:
* 无法将任何长方体放在另一个上面。
* 选择第 1 个长方体然后旋转它,使 35x3 的一面朝下,其高度为 76 。
* 示例 3:
* <p>
* 输入:cuboids = [[7,11,17],[7,17,11],[11,7,17],[11,17,7],[17,7,11],[17,11,7]]
* 输出:102
* 解释:
* 重新排列长方体后,可以看到所有长方体的尺寸都相同。
* 你可以把 11x7 的一面朝下,这样它们的高度就是 17 。
* 堆叠长方体的最大高度为 6 * 17 = 102 。
* <p>
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/maximum-height-by-stacking-cuboids
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
public class MaxHeight {
public int maxHeight(int[][] cuboids) {
for (int[] array : cuboids) {
Arrays.sort(array);
}
//降序排序
Arrays.sort(cuboids, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] != o2[0]) {
return o2[0] - o1[0];
}
if (o1[1] != o2[1]) {
return o2[1] - o1[1];
}
return o2[2] - o1[2];
}
});
//dp[i],前i个长方体,所能得到的最大高度
int[] dp = new int[cuboids.length];
int res = 0;
for (int i = 0; i < cuboids.length; i++) {
//初始化高度
dp[i] = cuboids[i][2];
for (int j = 0; j < i; j++) {
if (cuboids[j][0] >= cuboids[i][0] && cuboids[j][1] >= cuboids[i][1] && cuboids[j][2] >= cuboids[i][2]) {
//累加当前元素的高cuboids[i][2]
dp[i] = Math.max(dp[i], dp[j] + cuboids[i][2]);
}
}
res = Math.max(res, dp[i]);
}
return res;
}
}