LeetCode 1691. 堆叠长方体的最大高度(排序+最大上升子序DP)
文章目录
- 1. 题目
- 2. 解题
- 2.1 暴力超时解
- 2.2 排序+最长上升子序
463 / 3709,前 12.5%
1240 / 9290,前13.3%
1. 题目
给你 n 个长方体 cuboids ,其中第 i 个长方体的长宽高表示为 cuboids[i] = [widthi, lengthi, heighti]
(下标从 0 开始)。请你从 cuboids 选出一个 子集 ,并将它们堆叠起来。
如果 widthi <= widthj 且 lengthi <= lengthj 且 heighti <= heightj
,你就可以将长方体 i 堆叠在长方体 j 上。你可以通过旋转把长方体的长宽高重新排列,以将它放在另一个长方体上。
返回 堆叠长方体 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:
输入:cuboids = [[38,25,45],[76,35,3]]
输出:76
解释:
无法将任何长方体放在另一个上面。
选择第 1 个长方体然后旋转它,使 35x3 的一面朝下,其高度为 76 。示例 3:
输入: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 。提示:
n == cuboids.length
1 <= n <= 100
1 <= widthi, lengthi, heighti <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-height-by-stacking-cuboids
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 类似题目:
山谷序列(DP)
LeetCode 5559. 得到山形数组的最少删除次数(最长上升子序DP nlogn)
程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)
LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)
LeetCode 368. 最大整除子集(DP)
程序员面试金典 - 面试题 08.13. 堆箱子(DP)
LeetCode 673. 最长递增子序列的个数(DP)
LeetCode 1027. 最长等差数列(DP)
LeetCode 5545. 无矛盾的最佳球队(最大上升子序DP)
2.1 暴力超时解
- 复杂度太高了,超时
class Solution {public:int maxHeight(vector<vector<int>>& cub) {sort(cub.begin(), cub.end(),[&](auto& a, auto& b){return a[0]+a[1]+a[2] < b[0]+b[1]+b[2];});int n = cub.size();vector<vector<vector<int>>> dp(101,vector<vector<int>>(101, vector<int>(101, -1)));dp[0][0][0] = 0;dp[cub[0][0]][cub[0][1]][cub[0][2]] = max(dp[cub[0][0]][cub[0][1]][cub[0][2]],cub[0][2]);dp[cub[0][0]][cub[0][2]][cub[0][1]] = max(dp[cub[0][0]][cub[0][2]][cub[0][1]],cub[0][1]);dp[cub[0][1]][cub[0][0]][cub[0][2]] = max(dp[cub[0][1]][cub[0][0]][cub[0][2]],cub[0][2]);dp[cub[0][2]][cub[0][0]][cub[0][1]] = max(dp[cub[0][2]][cub[0][0]][cub[0][1]],cub[0][1]);dp[cub[0][1]][cub[0][2]][cub[0][0]] = max(dp[cub[0][1]][cub[0][2]][cub[0][0]],cub[0][0]);dp[cub[0][2]][cub[0][1]][cub[0][0]] = max(dp[cub[0][2]][cub[0][1]][cub[0][0]],cub[0][0]);for(int i = 1; i < n; ++i){vector<vector<vector<int>>> temp(dp.begin(), dp.end());int a = cub[i][0], b = cub[i][1], c = cub[i][2];for(int w = 0; w <= 100; ++w){for(int l = 0; l <= 100; ++l){for(int h = 0; h <= 100; ++h){if(temp[w][l][h] == -1)continue;if(a >= w && b >= l && c >= h)temp[a][b][c] = max(temp[a][b][c], dp[w][l][h]+c);if(b >= w && a >= l && c >= h)temp[b][a][c] = max(temp[b][a][c], dp[w][l][h]+c);if(a >= w && c >= l&& b >= h)temp[a][c][b] = max(temp[a][c][b], dp[w][l][h]+b);if(c >= w && a >= l&& b >= h)temp[c][a][b] = max(temp[c][a][b], dp[w][l][h]+b);if(b >= w && c >=l&& a >= h)temp[b][c][a] = max(temp[b][c][a], dp[w][l][h]+a);if(c >= w && b >=l&& a >= h)temp[c][b][a] = max(temp[c][b][a], dp[w][l][h]+a);}}}dp = temp;}int ans = 0;for(int h = 1; h <= 100; h++)for(int w = 1; w <= 100; ++w){for(int l = 1; l <= 100; ++l){ans = max(ans, dp[w][l][h]);}}return ans;}
};
2.2 排序+最长上升子序
- 先对每个长方体的长宽高排序
- 再对所有长方体按照(长宽高)排序
- 再利用最长上升子序DP
class Solution {public:int maxHeight(vector<vector<int>>& cub) {vector<vector<int>> C(6, vector<int>(3));C[0] = {0,1,2};C[1] = {0,2,1};C[2] = {1,0,2};C[3] = {1,2,0};C[4] = {2,0,1};C[5] = {2,1,0};//最后一维是高度维for(auto& c : cub)sort(c.begin(), c.end());sort(cub.begin(), cub.end());int n = cub.size();vector<vector<int>> dp(n, vector<int>(6, 0));dp[0][0] = cub[0][C[0][2]];dp[0][1] = cub[0][C[1][2]];dp[0][2] = cub[0][C[2][2]];dp[0][3] = cub[0][C[3][2]];dp[0][4] = cub[0][C[4][2]];dp[0][5] = cub[0][C[5][2]];for(int i = 1; i < n; ++i){for(int c1 = 0; c1 < 6; ++c1){dp[i][c1] = cub[i][C[c1][2]];//初始化为自己的高度for(int j = 0; j < i; ++j){for(int c2 = 0; c2 < 6; ++c2){ if(cub[j][C[c2][0]] <= cub[i][C[c1][0]]&& cub[j][C[c2][1]] <= cub[i][C[c1][1]]&& cub[j][C[c2][2]] <= cub[i][C[c1][2]]){dp[i][c1] = max(dp[i][c1], dp[j][c2]+cub[i][C[c1][2]]);}}}}}int ans = 0;for(int i = 0; i < n; i++){for(int k = 0; k < 6; k++){ans = max(ans, dp[i][k]);}}return ans;}
};
332 ms 9.8 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
LeetCode 1691. 堆叠长方体的最大高度(排序+最大上升子序DP)相关推荐
- 【1691. 堆叠长方体的最大高度】
来源:力扣(LeetCode) 描述: 给你 n 个长方体 cuboids ,其中第 i 个长方体的长宽高表示为 cuboids[i] = [widthi, lengthi, heighti](下 ...
- LeetCode 1626. 无矛盾的最佳球队(最大上升子序DP)
文章目录 1. 题目 2. 解题 1. 题目 假设你是球队的经理.对于即将到来的锦标赛,你想组合一支总体得分最高的球队.球队的得分是球队中所有球员的分数 总和 . 然而,球队中的矛盾会限制球员的发挥, ...
- LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)
1. 题目 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现. 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多 ...
- LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)
文章目录 1. 题目 2. 解题 1. 题目 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素. 每一次操作中,你可以在 arr 的任 ...
- LeetCode 1671. 得到山形数组的最少删除次数(最长上升子序DP nlogn)
文章目录 1. 题目 2. 解题 2.1 n^2 解法 2.2 nlogn 解法 197 / 1891,前10.4% 435 / 6154,前7.07% 前三题如下: LeetCode 5557. 最 ...
- [算法]LeetCode 专题 -- 二分查找专题 34. 在排序数组中查找元素的第一个和最后一个位置
LeetCode 专题 – 二分查找专题 34. 在排序数组中查找元素的第一个和最后一个位置 难度:中等 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值 ...
- php时间正序排序,列表的时间排序,应该正序还是倒序?
列表时间排序到底应该正序还是倒序?哪种体验会更好?各大知名产品都是如何做的? 背景 前阵子正好做到了一个类似 " 申请通知 " 的功能,因为涉及到列表,所以要考虑列表的排序规则,那 ...
- 《LeetCode力扣练习》第94题 二叉树的中序遍历 Java
<LeetCode力扣练习>第94题 二叉树的中序遍历 Java 一.资源 题目: 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,nul ...
- 树结构练习——排序二叉树的中序遍历(二叉搜索树)
树结构练习--排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是--(1).每 ...
最新文章
- Java项目:嘟嘟校园一卡通系统(java+JSP+Servlet+html+css+JavaScript+JQuery+Ajax+mysql)
- 大数据时代云计算在新媒体平台的应用研究
- SEO优化如何让网站关键词排名稳如狗?
- t-sql判断一个字符串是否为bigint的函数(全角数字需要判断为不合格)
- mips 内存 linux,MIPS 在linux中的内存映射
- qtmessagebox对话框里自定义按钮文本_按钮你可以这样设计
- 2018.9.15,Arduino—流水灯实验报告
- STM32 - 定时器的设定 - 基础 - 05 - Arbitrary waveform generation using timer DMAburst feature - 任意波形的序列产生
- 生成主键ID,唯一键id,分布式ID生成器雪花算法代码实现
- 弹性地基梁板法计算原理_基础专题
- 讯飞输入法pad版x86_讯飞输入法Pad版
- 计算机桌面的图片要点开才可以看,在桌面上的图片文件都不显示具体图片了 只能打开这个图片才能看到是哪张图片 请问怎么处理?...
- VUCA时代:软件架构解决复杂性之道
- Connection could not be established with host smtp.163.com 阿星小栈
- Python爬虫任务1
- 个人简历管理系统-总结
- 病毒乱花迷人眼,勿把“VX”当“全信”
- class 和 def
- 揭秘:QQ盗号背后的产业链,惊人的暴利!
- rsa加解密(兼容微信小程序环境)
热门文章
- fish工具_Python程序员使用哪些开发工具
- python中错误和异常处理
- 3d立体相册特效html网页代码_新闻类网页正文通用抽取器
- python 程序打包 vscode_使用VScode编写python程序并打包成.exe文件
- 计算abc=a!+b!+c!
- 驱动框架8——将驱动集成到内核中
- 从集合中选出一些元素组成子集合,使得这些子集合符合某种约束
- Android - Glide4.4.0使用
- SharePoint 2013的100个新功能之搜索(一)
- 使用数据库恢复专家,修复数据库