给你 n 对数字。在每一对中,第一个数字总是小于第二个数字。如果 b < c,一对 (c, d) 可以跟在另一对 (a, b) 之后。可以以这种方式形成对链。找出可以从给定的一组对中形成的最长链。
例子:
Input: (5, 24), (39, 60), (15, 28), (27, 40), (50, 90)
Output: (5, 24), (27, 40), (50, 90)
Input: (11, 20), {10, 40), (45, 60), (39, 40)
Output: (11, 20), (39, 40), (45, 60)
在上一篇文章中,我们讨论了最大长度对链问题。但是,该帖子仅涉及与查找最大尺寸链长度相关的代码,而不涉及最大尺寸链的构建。在这篇文章中,我们将讨论如何构建最大长度对链本身。
这个想法是首先按第一个元素的递增顺序对给定的对进行排序。令 arr[0..n-1] 为排序后的输入数组对。我们定义向量 L 使得 L[i] 本身是一个向量,它存储以 arr[i] 结尾的 arr[0..i] 对的最大长度链。因此,对于索引 i,L[i] 可以递归地写为 –
L[0] = {arr[0]}
L[i] = {Max(L[j])} + arr[i] where j < i and arr[j].b < arr[i].a
= arr[i], if there is no such j
例如,对于 (5, 24), (39, 60), (15, 28), (27, 40), (50, 90)
L[0]: (5, 24)
L[1]: (5, 24) (39, 60)
L[2]: (15, 28)
L[3]: (5, 24) (27, 40)
L[4]: (5, 24) (27, 40) (50, 90)
请注意对的排序已经完成,因为我们需要找到最大的对长度,排序在这里无关紧要。如果我们不排序,我们将按递增顺序获得对,但它们不会是最大可能的对。
以下是上述想法的实现 –
C++
/* Dynamic Programming solution to construct
Maximum Length Chain of Pairs */
#include
using namespace std;
struct Pair
{
int a;
int b;
};
// comparator function for sort function
int compare(Pair x, Pair y)
{
return x.a < y.a;
}
// Function to construct Maximum Length Chain
// of Pairs
void maxChainLength(vector arr)
{
// Sort by start time
sort(arr.begin(), arr.end(), compare);
// L[i] stores maximum length of chain of
// arr[0..i] that ends with arr[i].
vector > L(arr.size());
// L[0] is equal to arr[0]
L[0].push_back(arr[0]);
// start from index 1
for (int i = 1; i < arr.size(); i++)
{
// for every j less than i
for (int j = 0; j < i; j++)
{
// L[i] = {Max(L[j])} + arr[i]
// where j < i and arr[j].b < arr[i].a
if ((arr[j].b < arr[i].a) &&
(L[j].size() > L[i].size()))
L[i] = L[j];
}
L[i].push_back(arr[i]);
}
// print max length vector
vector maxChain;
for (vector x : L)
if (x.size() > maxChain.size())
maxChain = x;
for (Pair pair : maxChain)
cout << "(" << pair.a << ", "
<< pair.b << ") ";
}
// Driver Function
int main()
{
Pair a[] = {{5, 29}, {39, 40}, {15, 28},
{27, 40}, {50, 90}};
int n = sizeof(a)/sizeof(a[0]);
vector arr(a, a + n);
maxChainLength(arr);
return 0;
}
Python3
# Dynamic Programming solution to construct
# Maximum Length Chain of Pairs
class Pair:
def __init__(self, a, b):
self.a = a
self.b = b
def __lt__(self, other):
return self.a < other.a
def maxChainLength(arr):
# Function to construct
# Maximum Length Chain of Pairs
# Sort by start time
arr.sort()
# L[i] stores maximum length of chain of
# arr[0..i] that ends with arr[i].
L = [[] for x in range(len(arr))]
# L[0] is equal to arr[0]
L[0].append(arr[0])
# start from index 1
for i in range(1, len(arr)):
# for every j less than i
for j in range(i):
# L[i] = {Max(L[j])} + arr[i]
# where j < i and arr[j].b < arr[i].a
if (arr[j].b < arr[i].a and
len(L[j]) > len(L[i])):
L[i] = L[j]
L[i].append(arr[i])
# print max length vector
maxChain = []
for x in L:
if len(x) > len(maxChain):
maxChain = x
for pair in maxChain:
print("({a},{b})".format(a = pair.a,
b = pair.b),
end = " ")
print()
# Driver Code
if __name__ == "__main__":
arr = [Pair(5, 29), Pair(39, 40),
Pair(15, 28), Pair(27, 40),
Pair(50, 90)]
n = len(arr)
maxChainLength(arr)
# This code is contributed
# by vibhu4agarwal
输出:
(5, 29) (39, 40) (50, 90)
上述动态规划解决方案的时间复杂度为 O(n 2 ),其中 n 是对的数量。
程序使用的辅助空间为O(n 2 )。
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。