大家好,我是爱分享的小蓝,欢迎交流指正~
1 真题
输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
27
2 解析
难度系数:⭐⭐
考察题型:动态规划
涉及知识点:模块
思路分析:
1.循环遍历
遇到金字塔形状数据,先构建二重for循环,遍历每个数,进行求和计算O(∩_∩)O
2.递推公式
求和一共三种情况:元素在 最左边 or 中间 or 最右边
3.打印答案
最后打印需要分类讨论,奇数和偶数。
因为题目中要求:”向左下走的次数与向右下走的次数相差不能超过1“
按这个规则自己走一下,会发现答案必然落在中间。
如果n为奇数时,最后必然走到倒数第一行中间的数 a[-1][n//2]
而如果n为偶数时,则取中间两个数的最大值 max(a[-1][n//2-1],a[-1][n//2])
3 代码
#DP-数字三角形
n=int(input())#5
dp=[list(map(int,input().split())) for i in range(n)]
for i in range(1,n): #1~n-1
for j in range(i+1): #0~i
if j==0: #最左边元素只能由右上方得到
dp[i][j]+=dp[i-1][j]
elif j==i: #最右边元素只能由左上方得到
dp[i][j]+=dp[i-1][j-1]
else: #中间元素取上方相邻两个最大值
dp[i][j]+=max(dp[i-1][j-1],dp[i-1][j])
if n%2==1: #奇数行,返回中间值
print(dp[-1][n//2])
else: #偶数行,返回中间两个的最大值
print(max(dp[-1][n//2-1],dp[-1][n//2])) #27
'''样例输入 样例输出 样例输入 样例输出
i\j 0 1 2 3 4 0 1 2 3 4 0 1 2 3 0 1 2 3
0 7 7 7 7
1 3 8 10 15 3 8 10 15
2 8 1 0 18 16 15 8 1 0 18 16 15
3 2 7 4 4 20 25 20 19 2 7 4 4 20 25 20 19
4 4 5 2 6 5 24 30 27 26 24
'''
读码上万行,下键如有神,撸起袖子加油干!