问题描述
思路描述
其实和之前做的“数字三角形”那道题目差不多啦,也是从上往下遍历,定义一个从这个数开始保存最大数的列表,具体思路可以看我之前的文章:
https://blog.csdn.net/m0_53347750/article/details/122472202
源码
同样的,这道题目用简单的动态规划是不行的:
# dp
def dp(x, y):
global value
global n
if(x == n - 1):
return(value[x][y])
else:
temp_1 = dp(x + 1, y)
temp_2 = dp(x + 1, y + 1)
if(temp_1 > temp_2):
return(temp_1 + value[x][y])
else:
return(temp_2 + value[x][y])
# main
global value
global n
n = int(input())
value = [[0 for _ in range(n)] for _ in range(n)]
for i in range(n):
line = input().split()
for j in range(len(line)):
value[i][j] = int(line[j])
print(dp(0, 0))
需要中间新定义一个列表来保存数据,达到一个重复利用的效果
global triangle
global n
def MaxSum(i,j):
global n
global triangle
if i == n - 1:
return triangle[i][j]
if(maxSum[i + 1][j] == -1):
maxSum[i + 1][j] = MaxSum(i + 1, j)
if (maxSum[i + 1][j + 1] == -1):
maxSum[i + 1][j + 1] = MaxSum(i + 1, j + 1)
if(maxSum[i + 1][j] > maxSum[i + 1][j + 1]):
return maxSum[i + 1][j] + triangle[i][j]
return maxSum[i + 1][j + 1] + triangle[i][j]
# main()
n = int(input())
# 创建一个二维列表
triangle = [[0 for i in range(n)] for j in range(n)]
# 输入二维列表中的数字
maxSum=[[0 for s in range(n)]for k in range(n)]
# maxSum用于保存最优值
# 将maxSum中的值全部设置成-1
for s in range(n):
for k in range(s + 1):
maxSum[s][k] = -1
for i in range(n):
line = input().split()
for j in range(i + 1):
triangle[i][j] = int(line[j])
print(MaxSum(0, 0))