题目
给你 n 个长方体 cuboids ,其中第 i 个长方体的长宽高表示为 cuboids[i] = [widthi, lengthi, heighti](下标从 0 开始)。请你从 cuboids 选出一个 子集 ,并将它们堆叠起来。
如果 widthi <= widthj 且 lengthi <= lengthj 且 heighti <= heightj ,你就可以将长方体 i 堆叠在长方体 j 上。你可以通过旋转把长方体的长宽高重新排列,以将它放在另一个长方体上。
返回 堆叠长方体 cuboids 可以得到的 最大高度 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-height-by-stacking-cuboids
思路
动态规划
以i为结尾的最大高度
最后的状态是所有状态的最值
代码
class Solution {
public:
int maxHeight(vector<vector<int>>& cuboids) {
// 最长递增子序列
int n=cuboids.size();
vector<int> dp(n);
for(int i=0;i<n;i++){
sort(cuboids[i].begin(),cuboids[i].end());
}
sort(cuboids.begin(),cuboids.end(),[](vector<int>& arr1,vector<int>& arr2){
if(arr1[2]!=arr2[2])
return arr1[2]<arr2[2];
else if(arr1[1]!=arr2[1])
return arr1[1]<arr2[1];
else
return arr1[0]<arr2[0];
});
for(int i=0;i<n;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]){
dp[i]=max(dp[i],dp[j]+cuboids[i][2]);
}
}
}
return *max_element(dp.begin(),dp.end());
}
};