数字三角形

数字三角形

刚开始我也是想了一段时间,发现这一道题是动态规划的思想,dp数组的巧妙运用,用两个数组对条件进行分开处理,你会发现题目并不是很难
在这里插入图片描述
在这里插入图片描述

输入

通过题目的条件进行对输入,将输入的数字三角形放到列表中,便于处理,这时候,同时你应该想到下面的数是上面数的最大值加上它的本身,巧妙的将输入前面和后面加上一个零,因为下面的数要是上面一个数的正下方和右下方。

n = int(input())  # 输入几个数
A = []            #创建一个列表放输入的数字
for i in range(n): #将输入的放入列表中 【0】更好的遍历
    A = A + [[0] + [int(i) for i in input().strip().split()] + [0]]

创建dp 和 time 数组

题目说的是最大值,和向下,和下右不能超过1,这时候一个用两个二维数组进行对数据的整理,便于更好的分析

#纪录最后一行的每一个最大值
dp = [[0 for j in range(n + 1)] for i in range(n + 1)]
#纪录存放从顶点到某一位置的往右下的次数与往左下的次数的差值
time = [[0 for j in range(n + 1)] for i in range(n + 1)]
dp[0][1] = A[0][1]  #最上面数初始值

对数组进行遍历

dp[i][j] 取决一dp[i-1][j-1] 和dp[i-1][j] 的最大值 加上本身A[i][j],同时记得将另外一个数组进行记录操作 如果dp[i-1][j-1] 大 则将time[i][j]=time[i-1][j-1]+1加上它本身,反之 time[i][j]=time[i-1][j]-1

for i in range(1, n): 
    for j in range(1, i + 2): #下面的数取决与上面数的最大值 加原来的值
        if dp[i - 1][j - 1] > dp[i - 1][j]: #左上大 
            dp[i][j] = dp[i - 1][j - 1] + A[i][j]
            time[i][j] = time[i - 1][j - 1] + 1  #计算出之间的差值
        else:  
            dp[i][j] = dp[i - 1][j] + A[i][j]
            time[i][j] = time[i - 1][j] - 1

比较最后一行的符合条件的最大的数

最后一行就是数据的所有路径的最大值,进行挑选出来-1<=time<=1,
的情况的最大值.

maxnum = 0
for i in range(1, n + 1):
    if -1 <= time[n - 1][i] <= 1 and dp[n - 1][i] > maxnum:
        maxnum = dp[n - 1][i]
print(maxnum)

最后的结果:
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值