python - 在网格中递归收集硬币

标签 python recursion memoization

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

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

仅向下和向右移动的 max_coins = 2

最佳答案

首先,您需要这个问题背后的递推关系:如果单元格[i][j]中的最大硬币数量由C[i][j]表示,然后

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

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

因此,首先创建一个二维数组,其中包含任何单元格中可以拥有的最大硬币数量,然后使用递归关系将其填充为适当的值。从顶行到底部,从左到右。

关于python - 在网格中递归收集硬币,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23379031/

相关文章:

python - 从 0's and 1' 的字符串创建一组字符串,其中仅更改两个字符(python)

python - 组合 NumPy 数组

python - 如何在 Zenpy python 客户端库中将受托人设置为票证

algorithm - 为什么记忆化不能提高归并排序的运行时间?

python - 导入函数的内存

python - 通过移动 n 个数据点找到最小值

java - 将迭代转换为递归

c++ - 二叉树的递归搜索同时返回 true 和 false

c++ - c++中的置换计算

haskell - 对 Haskell 中的 Do 语句中的箭头感到困惑