我正在尝试学习动态编程技术。我正在看这个教程 - https://www.topcoder.com/community/data-science/data-science-tutorials/dynamic-programming-from-novice-to-advanced/。
请阅读StarAdventure
部分中问题Advanced
的问题陈述。
我不明白为什么我们不能只使用经典的DP方法,从左上角到右下角三次找到最佳路径,每次都找到最佳路径中找到的苹果。有人可以解释使用示例案例,为什么这种方法不起作用。
问题描述:
给定具有 M 行和 N 列( N x M )的矩阵。在每个细胞中都有许多苹果。 你从矩阵的左上角开始。你可以向下或向右一个单元格。你需要到达右下角。然后你需要回到左上角的单元格,向左或向上移动一个单元格。到达这个左上角的单元格后,你需要再次回到右下角的单元格。 找到您可以收集的最大苹果数量。 当你通过一个牢房 - 你收集那里剩下的所有苹果。
限制:
1< N,M < = 50;每个单元格包含0到1000个苹果,包括在内。
答案 0 :(得分:5)
您的算法可能会做出错误的决定,因为从一开始就没有考虑到您将有其他机会获得大奖励,从而降低您的总数。
示例:
S 0 0 50 1
1 1 1 0 1
1 1 1 0 1
1 1 1 50 1
1 1 1 50 E
你的算法将是S-0-0-50-0-0-50-50-E,然后是E-50(0)-1-1-1-1-1-1-S,然后是S- 0-1-1-1-1-50(0)-1-E。总共得到0个苹果7次(总奖励3 * 50 + 7 * 0 + 11 * 1 = 161)。
你可以做得更好:S-0-0-50-1-1-1-1-E,然后是E-50-1-1-1-1-1-1-S,然后是S- 0-1-1-1-1-50-1(0)-E,总共给你3 * 150 + 4 * 0 + 14 * 1 = 164个苹果。
所以你可以使用DP,但不能只用一次从S到E,然后再用E-S再到S-E。你必须立即考虑完整的路径。