📅  最后修改于: 2023-12-03 15:25:11.408000             🧑  作者: Mango
DP-20题是一道典型的动态规划问题,要求在给定的一组数对中,找到最长的一条链,使得链中每个数对的第二个元素都大于前一个数对的第一个元素。
给出 $n$ 个数对。在每个数对中,第一个数字总是比第二个数字小。定义在这样的一组数对中,链是由第一个数字递增排序而第二个数字递增排序得到的。如果我们有 $(a, b)$ 和 $(c, d)$,那么 $(a, b)$ 和 $(c, d)$之间形成的链当且仅当 $b<c$。
举个例子,如果我们有如下数对:
[(5, 24), (15, 25), (27, 40), (50, 60)]
则最长的链为 [(5, 24), (27, 40), (50, 60)]
。
这是一道经典的动态规划问题。可以从以下两个方面考虑:
然后我们可以按照以下方式进行迭代:
for j in range(i):
if pairs[j][1] < pairs[i][0]: # 如果满足条件
dp[i] = max(dp[i], dp[j] + 1)
其中,i
和 j
都是下标,pairs
是我们按第一个元素递增顺序排序的整个数对的列表。
最终我们要输出的结果应该是 $dp$ 数组的最大值。