这可以归类为动态编程还是贪婪的解决方案?

时间:2015-03-01 01:45:49

标签: algorithm dynamic-programming greedy

给出由N×M个细胞组成的表,每个细胞具有一定量的苹果。 你从左上角开始。在每个步骤中,您可以向下或向右移动一个单元格。 找到您可以收集的最大苹果数量。

1 个答案:

答案 0 :(得分:1)

对于此问题,下面定义的最自然贪婪方法不起作用

  

在每个单元格中,选择右侧或底部包含更多苹果的单元格

考虑以下示例:

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]