目录
题目介绍
解题思路
这是一道简单的动态规划题,我们可以先列出动态规划五部曲。
动态规划
1、dp数组及下标的含义
2、递推公式
3、dp数组如何初始化
4、遍历顺序
5、打印dp数组
- 使用dp二维数组,下表为(row,col)时,在该点最大的权值和。
- 递推公式根据情况有三种。其中两种是边界问题,另外一种是正常情况。
- 第一排仅有一个元素,只能选这一个元素,故dp[0][0] = li[0][0]
- 先遍历行,再遍历列
- 由于题目附加了特殊条件,即向左和向右次数之差不能大于1,而通过模拟发现,三角形行数为偶数时,符合条件的元素只能为dp[n-1][n//2] or dp[n-1][n//2-1],三角形行数为奇数时,符合条件的元素只能为dp[n-1][n//2]
代码实现
def ques_h():
n = int(input())
li = []
for i in range(n):
li.append(list(map(int,input().split())))
dp = [[0 for _ in range(i+1)] for i in range(n)]
dp[0][0] = li[0][0]
for row in range(1,n):
for col in range(row+1):
if col == 0:
dp[row][col] = dp[row-1][col] + li[row][col]
elif row == col:
dp[row][col] = dp[row-1][col-1] + li[row][col]
else:
dp[row][col] = max(dp[row-1][col]+li[row][col],dp[row-1][col-1]+li[row][col])
if n % 2 != 0:
return dp[n-1][n//2]
else:
return max(dp[n-1][n//2],dp[n-1][n//2-1])
print(ques_h())