假设我们有一个二维矩阵,其中的单元代表其中的硬币数量。我们有两个朋友来收集硬币,它们分别位于开始时的左上角和右上角。他们遵循以下规则:
硬币收集器可以从单元格(i,j)移至单元格(i + 1,j-1),(i + 1,j)或(i + 1,j + 1)。
到达牢房后,他们会收集所有可用硬币,使牢房变空。
收藏家可以选择留在一个牢房,但是任何一个牢房中的硬币只能收集一次。
我们必须找到可以收集的最大硬币数量。
所以,如果输入像
0 | 4 | 1 | 0 |
3 | 1 | 4 | 0 |
2 | 5 | 1 | 1 |
3 | 0 | 0 | 0 |
那么输出将为17。
为了解决这个问题,我们将遵循以下步骤-
A:=输入矩阵
R:= A的行数
C:= A的列数
定义一个功能dp()。这将需要r,c1,c2
对于[c2 − 1,c2,c2 + 1]中的每个nc2,执行
ans:= ans和(base + dp(r + 1,nc1,nc2))的最大值
如果0 <= nc1 <C和0 <= nc2 <C,则
返回0
如果r与R相同,则
ans:= A [r,c1] +(如果c1不等于c2,则1否则为0)* A [r,c2]
基本:= ans
对于[c1 − 1,c1,c1 + 1]中的每个nc1,执行
返回ans
返回dp(0,0,C − 1)
让我们看下面的实现以更好地理解-
class Solution: def solve(self, A): R, C = len(A), len(A[0]) def dp(r, c1, c2): if r == R: return 0 ans = base = A[r][c1] + (c1 != c2) * A[r][c2] for nc1 in [c1 − 1, c1, c1 + 1]: for nc2 in [c2 − 1, c2, c2 + 1]: if 0 <= nc1 < C and 0 <= nc2 < C: ans = max(ans, base + dp(r + 1, nc1, nc2)) return ans return dp(0, 0, C − 1) ob = Solution() print(ob.solve([ [0, 4, 1, 0], [3, 1, 4, 0], [2, 5, 1, 1], [3, 0, 0, 0] ]))
[ [0, 4, 1, 0], [3, 1, 4, 0], [2, 5, 1, 1], [3, 0, 0, 0] ]输出结果
17