我们已经在这篇文章中讨论了最长递增子序列问题的动态规划解决方案,并在这篇文章中讨论了一个 O(nLogn) 解决方案。以下是标准 LIS 问题的常见变体。
1. 搭建桥梁:考虑一张水平河流穿过其中心的二维地图。南岸有 n 个城市,x 坐标为 a(1) … a(n),北岸有 n 个城市,x 坐标为 b(1) … b(n)。您希望使用桥梁连接尽可能多的南北城市对,以免两座桥梁交叉。连接城市时,只能连接北岸的城市i和南岸的城市i。
8 1 4 3 5 2 6 7
<---- Cities on the other bank of river---->
--------------------------------------------
<--------------- River--------------->
--------------------------------------------
1 2 3 4 5 6 7 8
<------- Cities on one bank of river------->
来源:动态规划实践问题。该链接还为该问题提供了详细解释的解决方案。
此问题的解决方案已在此处发布。
2. 最大和递增子序列:给定一个由 n 个正整数组成的数组。编写一个程序,找出给定数组的最大和子序列,使子序列中的整数按升序排序。例如,如果输入为 {1, 101, 2, 3, 100, 4, 5},则输出应为 {1, 2, 3, 100}。此问题的解决方案已在此处发布。
3. 最长链给你一对数字。在一对中,第一个数字相对于第二个数字较小。假设您有两个集合 (a, b) 和 (c, d),如果 b < c,则第二个集合可以跟在第一个集合之后。所以你可以用类似的方式形成一条长链。找出可以形成的最长链。此问题的解决方案已在此处发布。
4.盒子堆叠给定一组 n 种矩形 3-D 盒子,其中第 i^ 个盒子的高度为 h(i),宽度为 w(i),深度为 d(i)(均为实数)。您想创建一堆尽可能高的盒子,但如果下部盒子的二维底面的尺寸都严格大于二维底面的尺寸,则只能将一个盒子堆叠在另一个盒子的顶部。 D 底座较高的盒子。当然,您可以旋转一个盒子,让任何一侧都作为它的基础。也允许使用相同类型的盒子的多个实例。
来源:动态规划实践问题。该链接还为该问题提供了详细解释的解决方案。
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。