##题目
题目描述
上图给出了一个数字三角形,从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你需要找到最大的路径和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。
输入描述
输入的第一行包含一个整数 N(1≤N≤100),表示三角形的行数。
下面的 N 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。
输入示例
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出示例
27
##分析
首先,我们将上述的数字三角形进行分解成对应的二维列表,列列表嵌套行列表。
其次,对应的数字三角形分为三部分理解,一部分是最右侧,一部分是最左侧,另一部分是中间部分。
再者,先除去左右步数相差不超过一,从上往下,行变量i,列变量j,每一行的元素个数为i+1个,
0 =< i < n,0 =< j < i+1,利用for循环将整个列表进行遍历,利用if语句进行判断符合数字三角形的从上往下的规则,找到最大值的路径
最后,我们可以将层数分为对应的奇数行和偶数行,如果是奇数行那么一定会落在最后一行及列表的list[-1][n//2]的中位数,如果是偶数行一定会落在最后一行max(list[-1[n//2-1],list[-1][n//2])中位数中的较大值
##代码
n = int(input())
f = []
for i in range(n):
f.append([int(i) for i in input().split()])
#将从键盘获取的元素利用append()函数一个一个地添加到f[]序列里面,利用split()不添加参数的函数默认值空格分隔,每一行对应的填充元素个数取决于i
#从上而下来进行元素的最大值求取
#第一部分是从第二行开始 1
#第二部分是每一行的行数等于元素相应的元素个数 i+1 = 第i行的元素个数 2
#第三部分最左侧只能从右上方过来 3
#第四部分最右列只能从左上方过来 4
#第五部分普通部分从上一行的左右元素的最大值来获取 5
for i in range (1,n):#1
for j in range (0,i+1):#2
if j == 0:#3
f[i][j] += f[i-1][j]
elif j == i:#4
f[i][j] += f[i-1][j-1]
else:#5
f[i][j] += max(f[i-1][j-1:j+1])
#目前并没有考虑左右步数相差为1
if(n%2==0):#判断奇数还是偶数行来确定最后一行的落点位置
print(max(f[-1][(n//2)-1], f[-1][(n//2)]))
else:
print(f[-1][(n//2)])
##运行结果
输入数据:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出结果:
27