python 最小硬币数_找出可以在Python中收集的最大硬币数量的问题

假设我们有一个二维矩阵,其中的单元代表其中的硬币数量。我们有两个朋友来收集硬币,它们分别位于开始时的左上角和右上角。他们遵循以下规则:硬币收集器可以从单元格(i,j)移至单元格(i + 1,j-1),(i + 1,j)或(i + 1,j + 1)。

到达牢房后,他们会收集所有可用硬币,使牢房变空。

收藏家可以选择留在一个牢房,但是任何一个牢房中的硬币只能收集一次。

我们必须找到可以收集的最大硬币数量。

所以,如果输入像0410

3140

2511

3000

那么输出将为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

如果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 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值