数字三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。
路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。
三角形的行数大于1小于等于100,数字为 0 - 99
输入格式:
5 //三角形行数。下面是三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
要求输出最大和
解题思路:使用动态规划,构建二维数组,数组中的数值表示到达当前节点的累计最大值,
运用动态规划解决的问题必须是希望在每个子问题上获得最优解(称为最优子结构)
用二维数组存放数字三角形。D( r, j) : 第r行第 j 个数字(r,j从1开始算)
MaxSum(r, j) : 从D(r,j)到底边的各条路径中,最佳路径的数字之和。
问题:求 MaxSum(1,1),典型的递归问题。
D(r, j)出发,下一步只能走D(r+1,j)或者D(r+1, j+1)。故对于N行的三角形:
if ( r == N)
MaxSum(r,j) = D(r,j)
else
MaxSum( r, j) = Max{ MaxSum(r+1,j), MaxSum(r+1,j+1) }+ D(r,j)
Python代码实现:
1 # 为了方便计算,数组的值从1,1位置开始存储
2 d = [[0] *101 for j in range(101)]
3
4
5 def MaxSum(i, j, rows):
6 if i == rows:
7 return d[i][j]
8 else:
9 x = MaxSum(i + 1, j, rows)
10 y = MaxSum(i + 1, j + 1, rows)
11 return max(x, y)+d[i][j]
12 def main():
13 global d
14 lines = int(input("请输入行数:"))
15 for i in range(lines):
16 line = input().split()
17 for j in range(i + 1):
18 d[i + 1][j + 1] = int(line[j])
19 # print(d)
20 maxPath = MaxSum(1,1,lines)
21 print("最大路径值为:%d"%maxPath)
22
23 if __name__ == "__main__":
24 main()