通过率 47% · 提交 1,459 · 通过 682
小慕最近在整理他的书架,每本书都有长和宽两个整数属性,分别记为(l, w)。他发现,如果一本书A的长和宽都严格大于另一本书B的长和宽,那么B就可以稳稳地在A的上面。 现在小慕手头有一组书籍,叠放时不允许旋转书本(即不能交换长和宽)。请你帮小慕计算一下,最多能有多少本书可以叠放在一起。
这类题属于华为 OD 机考真题方向中「200分 / LIS问题」方向的高频题型,通常考察对「200分 / LIS问题」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入:books = 20,16,15,11,10,10,9,10 说明:总共4本书籍, 第一本长度为20,宽度为16; 第二本书长度为15宽度为11; 依次类推,最后一本书长度为9,宽度为10
输出:3 最多能有多少个规格书籍能叠放在一起
示例 1
输入示例
20,16,15,11,10,10,9,10
输出示例
3
最多3个规格的书籍可以叠放到一起,从下到上依次为: [20,16],[15,11],[10,10]
示例 2
输入示例
20,15,15,20
输出示例
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
注意:本题和 俄罗斯套娃信封问题、面试题 17.08. 马戏团人塔、无矛盾的最佳球队 等题目几乎完全一致,属于 最长递增子序列 的轻变形题目。
先考虑一种比较简单的情况,所有书本的长度两两不等,例如用例:
我们可以把所有书本按照长度进行排列,得到:
对 books 进行排序后,单看长度的话,后面位置的书本长度一定大于前面位置的书本长度,即一定存在 books[i][0] > books[j][0] 对于任何 i > j 成立。故我们只需要考虑宽度即可,把所有宽度从 books 数组中提取出来可以得到宽度数组 widths:
为了使得叠放的书本尽可能多,子序列就要尽可能长。问题实际上转变为对宽度数组 widths 考虑 最长递增子序列(LIS) 问题,即宽度数组能够取得的 LIS 长度,就是整个书本数组能够取得的 LIS 长度。故我们对 widths 数组进行 LIS 问题的求解即可。
上述例子可以得到 widths 的 LIS 是 [1, 2, 3],对应 books 的 LIS 是 [(1, 1), (3, 2), (4, 3)],长度 3 即为答案。
对于书本长度可能相等的情况呢?考虑用例:
如果我们考虑对长度进行升序排序后,对长度相等的书本根据宽度也进行升序排序,那么会得到:
提取宽度数组 widths 得到:
显然此时 widths 的 LIS 是 [1, 2, 3, 4],长度为 4,但其对应的 books 数组的 LIS 并不能取 [(1, 1), (2, 2), (2, 3), (4, 4)],因为长度同样为 2 的书本的叠放并不符合要求。
为了避免上述问题,我们考虑对长度进行升序排序后,对长度相等的书本根据宽度进行 降序 排序,那么会得到:
提取宽度数组 widths 得到:
此时 widths 的 LIS 是 [1, 3, 4] 或者 [1, 2, 4],对应的 books 数组的 LIS 为 [(1, 1), (2, 3), (4, 4)] 或者 [(1, 1), (2, 2), (4, 4)],符合要求。
这是因为对于长度相等的书本而言,更小的宽度被排到更后的位置,这样当我们对宽度考虑 LIS 问题时,就不会出现长度相等的书籍出现在递增子序列中的情况了。
故最终我们选择 先依据长度升序,再依据宽度降序 的方式,对书本数组 books 进行排序:
在对书本数组进行排序之后,剩下部分就是对所有书本宽度做常规的 LIS 问题了,此部分可以参考 最长递增子序列。
我们考虑动态规划三部曲:
dp 数组是一个长度为 n 的一维列表,dp[i] 表示 以第 i 本书籍为结尾的最长递增子序列的长度。
对于第 i 本书,我们都去考虑其前面的第 i-1 本书,用索引 j 表示。如果第 i 本书的宽度大于第 j 本书的宽度,即存在 books[i][1] > books[j][1] 成立,那么 i 可能可以放在 j 的后面。 如果选择 i 放在 j 的下方能使得 i 叠放更多书籍,或者说递增子序列能够更长,那么我们选择 j。
以第 0 本书为结尾的最长递增子序列的长度为 1。其余书本对应的最长递增子序列长度也可以默认为 1。
PS:这类 LIS 问题还存在更加优秀的时间复杂度为 O(n log n) 的 贪心 + 二分 解法,但已经有点超纲。对于 OD 考试而言,时间复杂度为 O(n²) 的 dp 解法已经完全够用。 具体可详见文档 再论 LIS 问题:贪心 + 二分算法。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
1
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有