不考虑最后一个事件的动态规划解决方案

问题描述 投票:0回答:1

我自学了乔恩·克莱因伯格(Jon Kleinberg)写的《算法设计》一书,这个问题几天来一直让我头疼。这是它的删节版本:

  • 有 n 个事件,它们按顺序发生,每个事件间隔恰好一分钟。因此,事件 j 发生 在第 j 分钟。 如果他们没有在第 j 分钟观察到此事件,则 他们错过了。
  • 事件发生在特定坐标处。正在使用望远镜来观察这些事件。它只能以每分钟一度的速度移动。一般来说,需要 |我 - j |从位置 i 到达位置 j 的时间。因此,他们不期望能够观察到所有 n 个事件。望远镜可以处于任何起始坐标。
  • 我们总是想看最后一场活动。
假设您的输入始终按开始时间排序。我们希望返回我们可以观看的最多数量的事件,以便我们始终观看最后一个事件并为望远镜移动留出时间。

我决定使用一维动态规划方法来解决这个问题。这是我到目前为止所拥有的:

def astronomyNight(events): n = len(events) dp = [1] * n # Store the solutions to our subproblems. # The last event can always be observed dp[n - 1] = 1 for i in range(n - 2, -1, -1): for j in range(n-1, i, -1): if (events[j][0] - events[i][0]) > abs(events[j][1] - events[i][1]): dp[i] = max(dp[i], dp[i-1] + 1) return max(dp) # Given schedule of events. # First element is the event's start time # Second element is the event's location events = [(1, 3), (2, 3), (3, 3), (4, 3), (5, 1)] result = max_viewable_events(events) print("Maximum number of viewable events:", result)
我相信代码中给定示例的解决方案应该是

3。然而,我的代码总是设法返回数字4。我已经做了一些打印调试,并意识到在 i 的第二次迭代中,我们发生了这种情况:

------ 2 ------ j = 4 COMPARISON ( 5 - 3 ) >= ( | 1 - 3 | ) DP [1, 1, 1, 1, 1] j = 3 COMPARISON ( 4 - 3 ) >= ( | 3 - 3 | ) MAX-STATMENT dp[ 2 ]= 1 or dp[ 1 ] + 1 = 2 DP [1, 1, 2, 1, 1]
j=3 时 2 的解不是考虑了最后一个事件不发生的情况吗?如何获得最终结果以仅考虑最后一个事件发生的情况?

谢谢!

python algorithm dynamic-programming
1个回答
0
投票
在动态规划(DP)中,考虑最后一个事件通常涉及涉及序列或区间的优化解决方案。在实施 DP 时,确保考虑到所有情况(包括最后一个事件)以获得准确的解决方案至关重要。错过最后一个事件可能会导致结果不理想或不正确。

例如,在涉及序列或区间的问题中(例如求子序列的最大和或最长递增子序列),忽略最后一个元素可能会导致丢失最优解。

要纠正 DP 解决方案中未考虑最后一个事件的问题,请考虑以下步骤:

1。检查基本案例: 确保正确定义 DP 解决方案的基本情况或初始状态,包括序列或间隔在最后一个元素结束的情况。

2。回顾递归关系: 评估 DP 解中使用的递推关系或转移方程。确保它们涵盖所有可能性,包括序列中的最后一个事件或元素。

3.检查边界条件: 验证边界条件或约束是否包含最后一个事件。如果需要包括最后一个事件,请调整条件或约束。

4。测试用例和调试: 使用涉及最后一个事件的特定测试用例来测试 DP 解决方案。检查输出并调试代码以确定可能不考虑最后一个事件的部分。

5。审核终止标准: 如果 DP 解决方案涉及迭代或递归调用,请检查终止标准以确认它们包括对最后一个事件或元素的考虑。

通过彻底检查这些方面并确保 DP 解决方案考虑了最后一个事件,您可以改进算法,为给定问题生成准确且最佳的结果。

© www.soinside.com 2019 - 2024. All rights reserved.