数字三角形
刚开始我也是想了一段时间,发现这一道题是动态规划的思想,dp数组的巧妙运用,用两个数组对条件进行分开处理,你会发现题目并不是很难
输入
通过题目的条件进行对输入,将输入的数字三角形放到列表中,便于处理,这时候,同时你应该想到下面的数是上面数的最大值加上它的本身,巧妙的将输入前面和后面加上一个零,因为下面的数要是上面一个数的正下方和右下方。
n = int(input()) # 输入几个数
A = [] #创建一个列表放输入的数字
for i in range(n): #将输入的放入列表中 【0】更好的遍历
A = A + [[0] + [int(i) for i in input().strip().split()] + [0]]
创建dp 和 time 数组
题目说的是最大值,和向下,和下右不能超过1,这时候一个用两个二维数组进行对数据的整理,便于更好的分析
#纪录最后一行的每一个最大值
dp = [[0 for j in range(n + 1)] for i in range(n + 1)]
#纪录存放从顶点到某一位置的往右下的次数与往左下的次数的差值
time = [[0 for j in range(n + 1)] for i in range(n + 1)]
dp[0][1] = A[0][1] #最上面数初始值
对数组进行遍历
dp[i][j] 取决一dp[i-1][j-1] 和dp[i-1][j] 的最大值 加上本身A[i][j],同时记得将另外一个数组进行记录操作 如果dp[i-1][j-1] 大 则将time[i][j]=time[i-1][j-1]+1加上它本身,反之 time[i][j]=time[i-1][j]-1
for i in range(1, n):
for j in range(1, i + 2): #下面的数取决与上面数的最大值 加原来的值
if dp[i - 1][j - 1] > dp[i - 1][j]: #左上大
dp[i][j] = dp[i - 1][j - 1] + A[i][j]
time[i][j] = time[i - 1][j - 1] + 1 #计算出之间的差值
else:
dp[i][j] = dp[i - 1][j] + A[i][j]
time[i][j] = time[i - 1][j] - 1
比较最后一行的符合条件的最大的数
最后一行就是数据的所有路径的最大值,进行挑选出来-1<=time<=1,
的情况的最大值.
maxnum = 0
for i in range(1, n + 1):
if -1 <= time[n - 1][i] <= 1 and dp[n - 1][i] > maxnum:
maxnum = dp[n - 1][i]
print(maxnum)
最后的结果: