题目描述:
在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100,数字为 0 - 99。
输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出:
30
代码:【自顶向下】
n = int(input())
dp = [[0] * 110 for _ in range(110)]
a = [[0] * 110 for _ in range(110)]
for i in range(1, n + 1):
input_values = input().split()
for j in range(1, i + 1):
dp[i][j] = int(input_values[j - 1])
for j in range(1, n + 1):
a[n][j] = dp[n][j]
for i in range(n, 0, -1):
for j in range(1, i + 1):
if a[i][j] > a[i][j + 1]:
a[i - 1][j] = a[i][j] + dp[i - 1][j]
else:
a[i - 1][j] = a[i][j + 1] + dp[i - 1][j]
print(a[1][1])
【自底向上】:
n = int(input())
a = [[0] * 103 for _ in range(103)]
dp = [[0] * 103 for _ in range(103)]
for i in range(1, n + 1):
input_values = input().split()
for j in range(1, i + 1):
a[i][j] = int(input_values[j - 1])
for i in range(0, n + 1):
dp[i][0] = 0
dp[1][1] = a[1][1]
for i in range(2, n + 1):
for j in range(1, i + 1):
if dp[i - 1][j - 1] >= dp[i - 1][j]:
dp[i][j] = dp[i - 1][j - 1] + a[i][j]
else:
dp[i][j] = dp[i - 1][j] + a[i][j]
m = 0
for i in range(0, n + 1):
if dp[n][i] > m:
m = dp[n][i]
print(m)