如何编写一个递归代码,告诉我可以从网格中收集的最大硬币数量,其中每个单元格可能包含也可能不包含仅向右和向下移动的硬币?我还必须使用memoization。
ex: [[0,0,1],
[0,1,1],
[1,0,0]]
max_coins仅向下和向右移动= 2
答案 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数组,其中包含您可以在任何单元格中拥有的最大硬币数,然后使用递归关系使用适当的值填充它。从上到下,从左到右。