备赛蓝桥杯【大学python组】6数字三角形

题目描述:

在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100,数字为 0 - 99。

输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

输出:

30

代码:【自顶向下】

n = int(input())
dp = [[0] * 110 for _ in range(110)]
a = [[0] * 110 for _ in range(110)]

for i in range(1, n + 1):
    input_values = input().split()
    for j in range(1, i + 1):
        dp[i][j] = int(input_values[j - 1])

for j in range(1, n + 1):
    a[n][j] = dp[n][j]

for i in range(n, 0, -1):
    for j in range(1, i + 1):
        if a[i][j] > a[i][j + 1]:
            a[i - 1][j] = a[i][j] + dp[i - 1][j]
        else:
            a[i - 1][j] = a[i][j + 1] + dp[i - 1][j]

print(a[1][1])

【自底向上】:

n = int(input())
a = [[0] * 103 for _ in range(103)]
dp = [[0] * 103 for _ in range(103)]

for i in range(1, n + 1):
  input_values = input().split()
  for j in range(1, i + 1):
    a[i][j] = int(input_values[j - 1])

for i in range(0, n + 1):
  dp[i][0] = 0

dp[1][1] = a[1][1]

for i in range(2, n + 1):
  for j in range(1, i + 1):
    if dp[i - 1][j - 1] >= dp[i - 1][j]:
      dp[i][j] = dp[i - 1][j - 1] + a[i][j]
    else:
      dp[i][j] = dp[i - 1][j] + a[i][j]

m = 0
for i in range(0, n + 1):
  if dp[n][i] > m:
    m = dp[n][i]

print(m)

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值