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阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

doctype声明、浏览器的标准、怪异等模式

doctype 标准(严格)模式(Standards Mode)、怪异(混杂)模式(Quirks Mode),如何触发&#xff0c;区分他们有何意义&#xff1f; 触发标准模式 1、加DOCTYPE声明,比如&#xff1a;<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xht…

python:文件操作

1. 文件操作介绍 说到操作文件我们肯定会想到流&#xff0c;文件的操作都是通过流来操作的。在python中文件的操作非常简单&#xff0c;并不像Java等其他语言一样有各种各样的流操作&#xff0c;我们直接使用open函数即可打开一个文件&#xff0c;然后进行各种操作&#xff0c…

使用LSTM建立seq2seq模型进行语言翻译

文章目录1. 数据处理2. 编码器、解码器数据2.1 编码器2.2 解码器2.3 模型3. 训练4. 推理模型5. 采样参考 基于深度学习的自然语言处理 1. 数据处理 读取数据 with open(deu.txt, r, encodingutf-8) as f:lines f.read().split(\n) print("文档有 {} 行。".format(…

【struts2】预定义拦截器

&#xff11;&#xff09;预定义拦截器 Struts2有默认的拦截器配置&#xff0c;也就是说&#xff0c;虽然我们没有主动去配置任何关于拦截器的东西&#xff0c;但是Struts2会使用默认引用的拦截器。由于Struts2的默认拦截器声明和引用都在这个Struts-default.xml里面&#xff0…

微信小程序页面跳转方法总结

微信小程序页面跳转目前有以下方法&#xff08;不全面的欢迎补充&#xff09;&#xff1a; 1. 利用小程序提供的 API 跳转&#xff1a; // 保留当前页面&#xff0c;跳转到应用内的某个页面&#xff0c;使用wx.navigateBack可以返回到原页面。 // 注意&#xff1a;调用 navig…

使用注意力机制建模 - 标准化日期格式

文章目录1. 概述2. 数据3. 模型4. 训练5. 测试参考 基于深度学习的自然语言处理本文使用attention机制的模型&#xff0c;将各种格式的日期转化成标准格式的日期 1. 概述 LSTM、GRU 减少了梯度消失的问题&#xff0c;但是对于复杂依赖结构的长句子&#xff0c;梯度消失仍然存…

微信小程序在当前页面设置其他页面的数据

如果其他页面用到的数据是 globalData&#xff0c; 那么直接在当前页面修改 globalData 数据即可。 如果其他页面用到的数据是 storage&#xff0c; 那么直接在当前页面修改 storage 数据即可。 场景&#xff1a;&#xff08;由 A 页面跳转到 B 页面&#xff09; 在 B 页面完…

牛客 数学实验(模拟)

文章目录1. 题目2. 解题1. 题目 链接&#xff1a;https://ac.nowcoder.com/acm/contest/10166/A 来源&#xff1a;牛客网 牛牛在做数学实验。 老师给了牛牛一个数字n&#xff0c;牛牛需要不断地将所有数位上的值做乘法运算&#xff0c;直至最后数字不发生变化为止。 请你帮牛…

css动画之波纹

样式定义&#xff1a; #ContactAbout { height: auto; position: relative; overflow: hidden; } #sectioncontact { display: block; width: 100%; position: relative; height: 700px; z-index: 10; }#sectioncontact .map { width: 370px; height: 280px; position: absolut…

牛客 奇怪的排序问题(单调栈/遍历)

文章目录1. 题目2. 解题1. 题目 链接&#xff1a;https://ac.nowcoder.com/acm/contest/10166/B 来源&#xff1a;牛客网 操场上有n个人排成一队&#xff0c;这n个人身高互不相同&#xff0c;可将他们的身高视为一个1到n的排列。 这时需要把队伍变成升序&#xff0c;也就是从…

Python 中,matplotlib绘图无法显示中文的问题

在python中&#xff0c;默认情况下是无法显示中文的&#xff0c;如下代码&#xff1a; import matplotlib.pyplot as plt# 定义文本框和箭头格式 decisionNode dict(boxstyle "sawtooth", fc "0.8") leafNode dict(boxstyle "round4", fc …

使用Marshal.Copy把Txt行数据转为Struct类型值

添加重要的命名空间: using System.Runtime.InteropServices; 先建立结构相同(char长度相同)的Struct类型用于转换: [StructLayout(LayoutKind.Sequential, Pack 1)]public struct Employee{[MarshalAs(UnmanagedType.ByValArray, SizeConst 6)]public char[] EmployeeId;[Ma…

牛客 XOR和(找规律)

文章目录1. 题目2. 解题1. 题目 链接&#xff1a;https://ac.nowcoder.com/acm/contest/10166/C 来源&#xff1a;牛客网 牛牛最近学会了异或操作&#xff0c;于是他发现了一个函数 f(x)x⊕(x−1)f(x)x\oplus (x-1)f(x)x⊕(x−1)&#xff0c;现在牛牛给你一个数 n&#xff0c…

采用contentprivider扫描手机SD卡的图片资源

Intent inten new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(inten,21);------------------------在onActivityResult中加入-------------------Uri uri data.getData();String[] filePath { MediaStore.Images.Med…

天池 在线编程 数组划分III(计数)

文章目录1. 题目2. 解题1. 题目 https://tianchi.aliyun.com/oj/231188302809557697/235445278655844965 给你一个整数数组和一个整数K&#xff0c;请你判断数组是否可以划分为若干大小为k序列&#xff0c;并满足以下条件&#xff1a; 数组中的每一个数恰恰出现在一个序列中…

详解nohup和 区别

一、nohup nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令&#xff0c;忽略所有挂断&#xff08;SIGHUP&#xff09;信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令&#xff0c;添加 & &#xff08; 表示“and”的符号&#xf…

谈谈.NET MVC QMVC高级开发

自从吾修主页上发布了QMVC1.0&#xff0c;非常感兴趣&#xff0c;用了半月的时间学习&#xff0c;真的感觉收益非浅&#xff0c;在此声明非常感谢吾修大哥的分享&#xff01; 1、轻快简单&#xff0c;框架就几个类&#xff0c;简单&#xff0c;当然代码少也就运行快&#xff01…

天池 在线编程 最小振幅(排序)

文章目录1. 题目2. 解题1. 题目 https://tianchi.aliyun.com/oj/231188302809557697/235445278655844966 给定一个由N个整数组成的数组A&#xff0c;一次移动&#xff0c;我们可以选择此数组中的任何元素并将其替换为任何值。 数组的振幅是数组A中的最大值和最小值之间的差。…

文件系统的类型

文件系统的类型 文件系统类型&#xff1a; ext2 &#xff1a; 早期linux中常用的文件系统 ext3 &#xff1a; ext2的升级版&#xff0c;带日志功能 RAMFS &#xff1a; 内存文件系统&#xff0c;速度很快 NFS &#xff1a; 网络文件系统&#xff0c;由SUN发明&a…

Git中非常重要的一个文件——.gitignore详解

首先要强调一点&#xff0c;这个文件的完整文件名就是“.gitignore”&#xff0c;注意最前面有个“.”。这样没有扩展名的文件在Windows下不太好创建&#xff0c;这里给出win7的创建方法&#xff1a; 创建一个文件&#xff0c;文件名为&#xff1a;“.gitignore.”&#xff0c…