一、问题的提出
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
输出格式:
30 //输出路线的最大值
二、实例分析
顺推法:(dp(i,j)的值)
7
7+3=10 7+8=15
10+8=18 max(10,15)+1=16 15+0=15
18+2=20 max(18,16)+7=25 max(16,15)+4=20 15+4=19
20+4=24 max(20,25)+5=30 max(25,20)+2=27 max(20,19)+6=26 19+5=24
三、状态转移方程
(1)j=0
dp[i][j]=dp[i-1][j]+ls[i][j]
(2)j=i
dp[i][j]=dp[i-1][j-1]+ls[i][j]
(3)其 它
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+ls[i][j]
四、python代码
def maxsum(ls):
n=len(ls)
dp=[[0]*i for i in range(1,n+1)]
dp[0][0]=ls[0][0]
for i in range(1,n):
for j in range(i+1):
if j==0:
dp[i][j]=dp[i-1][j]+ls[i][j]
elif i==j:
dp[i][j]=dp[i-1][j-1]+ls[i][j]
else:
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+ls[i][j]
return max(dp[n-1])
ls=[[7],[3,8],[8,1,0],[2,7,4,4],[4,5,2,6,5]]
print(maxsum(ls))