1691. 堆叠长方体的最大高度
目录
1、java
2、c++
思路:
根据题目描述,长方体 j 能够放在长方体 i 上,当且仅当
题目允许旋转长方体,也就是可以选择长方体的任意一边作为长方体的高。
对于任意一种合法的堆叠,如果我们把里面每个长方体都旋转至,堆叠仍然是合法的,并且能够保证堆叠的高度最大化。
我们可以把所有长方体的边长进行排序,使得每个长方体满足。然后将每个长方体升序排列。
定义dp[i] 以第i个长方体为底能得到的最大高度和
枚举每个长方体 i 的上方的长方体 j,其中j<i
如果 j 可以放在 i 的上方,那么我们可以得到状态转移方程:
最后答案就是 max(dp[i])
1、java
class Solution {
public int maxHeight(int[][] c) {
int n=c.length;
int res=0;
int[] dp=new int[n+1];
//dp[i] 以第i个长方体为底能得到的最大高度和
for(int[] x:c) Arrays.sort(x); //将每个长方体按 w≤l≤h 排序
//将所有长方体按 wj≤wi lj≤li hj≤hi 排列
Arrays.sort(c,(a,b)->a[0]==b[0]? (a[1]==b[1]? a[2]-b[2]:a[1]-b[1]):a[0]-b[0]);
for(int i=0;i<n;i++)
{
dp[i]=c[i][2];
for(int j=0;j<i;j++)
if(c[j][1]<=c[i][1]&&c[j][2]<=c[i][2])
dp[i]=Math.max(dp[i],dp[j]+c[i][2]);
res=Math.max(res,dp[i]);
}
return res;
}
}
2、c++
class Solution {
public:
int maxHeight(vector<vector<int>>& cub) {
int n = cub.size(), ans = 0;
vector<int> dp(n,0);
for (auto& t : cub) sort(t.begin(), t.end());
sort(cub.begin(), cub.end(), [](vector<int>& a, vector<int>& b){ return a[0] == b[0] ? (a[1] == b[1] ? a[2] < b[2] : a[1] < b[1]) : a[0] < b[0];});
for (int i = 0; i < n; i++) {
dp[i] = cub[i][2];
for (int j = 0; j < i; j++)
if(cub[i][1]>=cub[j][1] && cub[i][2]>=cub[j][2])
dp[i] = max(dp[i], dp[j] + cub[i][2]);
ans = max(dp[i], ans);
}
return ans;
}
};