【蓝桥杯】【python】夺宝奇兵

问题描述

在这里插入图片描述

思路描述

其实和之前做的“数字三角形”那道题目差不多啦,也是从上往下遍历,定义一个从这个数开始保存最大数的列表,具体思路可以看我之前的文章:

https://blog.csdn.net/m0_53347750/article/details/122472202

源码

同样的,这道题目用简单的动态规划是不行的:

# dp
def dp(x, y):
    global value
    global n
    
    if(x == n - 1):
        return(value[x][y])

    else:
        
        temp_1 = dp(x + 1, y)
        temp_2 = dp(x + 1, y + 1)

        if(temp_1 > temp_2):
            return(temp_1 + value[x][y])
        else:
            return(temp_2 + value[x][y])

# main
global value
global n

n = int(input())
value = [[0 for _ in range(n)] for _ in range(n)]

for i in range(n):
    line = input().split()

    for j in range(len(line)):
        value[i][j] = int(line[j])

print(dp(0, 0))

需要中间新定义一个列表来保存数据,达到一个重复利用的效果

global triangle
global n

def MaxSum(i,j):
    global n
    global triangle
    if i == n - 1:
        return triangle[i][j]
    if(maxSum[i + 1][j] == -1):
        maxSum[i + 1][j] = MaxSum(i + 1, j)
    if (maxSum[i + 1][j + 1] == -1):
        maxSum[i + 1][j + 1] = MaxSum(i + 1, j + 1)
    if(maxSum[i + 1][j] > maxSum[i + 1][j + 1]):
        return maxSum[i + 1][j] + triangle[i][j]
    return maxSum[i + 1][j + 1] + triangle[i][j]
    
# main()
n = int(input())
# 创建一个二维列表
triangle = [[0 for i in range(n)] for j in range(n)]
# 输入二维列表中的数字
maxSum=[[0 for s in range(n)]for k in range(n)]
# maxSum用于保存最优值
# 将maxSum中的值全部设置成-1
for s in range(n):
    for k in range(s + 1):
        maxSum[s][k] = -1

for i in range(n):
    line = input().split()
    for j in range(i + 1):
        triangle[i][j] = int(line[j])

print(MaxSum(0, 0))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值