【发布时间】:2015-03-01 01:45:48
【问题描述】:
给出了一个由 N x M 个单元组成的表格,每个单元有一定数量的苹果。 你从左上角开始。在每一步,您都可以向下或向右移动一个单元格。 找出您可以收集的最大苹果数。
【问题讨论】:
标签: algorithm dynamic-programming greedy
给出了一个由 N x M 个单元组成的表格,每个单元有一定数量的苹果。 你从左上角开始。在每一步,您都可以向下或向右移动一个单元格。 找出您可以收集的最大苹果数。
【问题讨论】:
标签: algorithm dynamic-programming greedy
下面定义的最自然的贪心方法不适用于此问题。
在每个单元格中,选择右侧或底部包含更多苹果的单元格
考虑以下示例:
0 0 0 0
1 0 0 5
1 0 0 0
1 0 0 0
贪心方法将采用路径M[0, 0] → M[3, 0] → M[3, 3](从左上角到左下角,然后到右下角),这给了我们三个苹果。这显然不是这种情况下的最佳解决方案。
您应该部署动态编程技术来解决这个问题。令D[i, j] 表示从左上角(0, 0) 到(i, j) 的最优解,因为每一步我们都可以向下或向右,显然我们有子问题之间的关系如下:
D[i, j] = c(i, j) + max{ D[i - 1, j], D[i, j - 1] }
其中c(i, j) 表示(i, j) 中的苹果数。从最小的子问题D[0, 0] = c(0, 0)开始,我们可以使用上面的公式,通过评估直接子问题的值来计算D[N, M]。
【讨论】: