递归硬币在网格中收集

时间:2014-04-30 03:13:44

标签: python recursion memoization

如何编写一个递归代码,告诉我可以从网格中收集的最大硬币数量,其中每个单元格可能包含也可能不包含仅向右和向下移动的硬币?我还必须使用memoization。

ex:  [[0,0,1],
      [0,1,1],
      [1,0,0]]

max_coins仅向下和向右移动= 2

1 个答案:

答案 0 :(得分:1)

首先,您需要此问题背后的递归关系:如果单元格[i][j]的最大硬币数由C[i][j]表示,则

C[i][j] = max(C[i - 1][j], C[i][j - 1]) + No. of coins on cell[i][j]

如果使用此重复进行编码,则对于不同的单元格,相同的调用将具有相同参数的许多重叠,并且其复杂性将是指数级的。为避免这种情况,您可以中间调用的结果存储在一个数组中,并在再次需要时使用它们。这样,您只需要计算一次单元格的值,代码就会快得多。

因此,首先创建一个2D数组,其中包含您可以在任何单元格中拥有的最大硬币数,然后使用递归关系使用适当的值填充它。从上到下,从左到右。