俄罗斯套娃信封问题:动态规划求解最长上升子序列
给定一个二元信息组envelopes,其中 envelopes[i] = [wi, hi],表示第 i 个信封的宽度和高度。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算最多能有多少个信封能组成一组'俄罗斯套娃'信封(即可以把一个信封放到另一个信封里面)。
注意:不允许旋转信封。
【输入】:
第一行为一个正整数 n(INT 范围内),代表信封总数,接下来一行,包含 2 * n 个正整数(INT 范围内)分表代表每个信封的宽度和高度。
【输出】:
能组成一组'俄罗斯套娃'信封组中所含的最多信封数。
思路:
首先按照宽度从小到大排序,如果宽度相同则按照高度从大到小排序。然后就转化为了求高度的最长上升子序列(LIS)问题。可以使用动态规划解决。
定义 dp[i] 表示以第 i 个信封为结尾的最长上升子序列长度,初始化为 1。对于每个 i,遍历 0~i-1 的所有 j,如果 envelopes[j] 可以放入 envelopes[i] 中,则更新 dp[i]=max(dp[i],dp[j]+1)。最终的答案为 dp 数组中的最大值。
时间复杂度: O(n^2)
原文地址: https://www.cveoy.top/t/topic/oWTC 著作权归作者所有。请勿转载和采集!