拿金币 蓝桥杯

问题描述

  有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。

输入格式

  第一行输入一个正整数n。

  以下n行描述该方格。金币数保证是不超过1000的正整数。

输出格式

  最多能拿金币数量。

样例输入

3

1 3 3

2 2 2

3 1 2

样例输出

11

数据规模和约定

  n<=1000

可以参考之前我写过的leetcode62题 不同路径leetcode62. 不同路径_小梁今天敲代码了吗的博客-CSDN博客

它们的区别是:不同路径是求到最后一个格子有多少种路径,而这道题是求最多能拿的金币数,相比于不同路径还需考虑每个格子的金币值

这道题有三种情况:

(1)在第一个格子时,取得最大金币,此时

a[i][j] = a[i][j]

(2)在第一行或者第一列时,因为第一行或者第一列都只能由自己的上方或者左方获得,所以我们可以推出

a[i][j]=a[i][j]+a[i-1][j] (j=0)

a[i][j]=a[i][j]+a[i][j-1] (i=0)

(3)在其他位置时

a[i][j]=a[i][j]+max(a[i-1][j],a[i][j-1])

n = int(input())
a= [[] for i in range(n)]#申请空间
for i in range(n):
    a[i] = list(map(int,input().split()))
for i in range(n):
    for j in range(n):
        if i==0 and j==0:
            a[i][j]=a[i][j]
        elif i==0:
            a[i][j]=a[i][j-1]+a[i][j]
        elif j==0:
            a[i][j]=a[i][j]+a[i-1][j]
        else:
            a[i][j] =a[i][j]+max(a[i-1][j],a[i][j-1])
print(a[n-1][n-1])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小梁今天敲代码了吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值