在一个n*m的方格中,m为奇数,放置有n*m个数,方格中间的下方有一人,此人可按照正前方相临的五个方向(方格)前进但不能越出方格。人每走过一个方格必须取此方格中的数。要求找到一条从底到顶的路径,使其数相加之和为最大。输出和的最大值。

这道题使用动态规划来做,要使路径和最大,那么就要让每一步的走法都是最优的。才能保证最后的结果才是最大。
反向思维,假如我们第二步选择了-1,那么如何保证上一步最优呢?
将所有能到达-1的位置的数字与-1相加从而比较出最大值那么,就保证了此时最优。
① -1 --->-1 -2
②3 ---> -1 2
所以要选-1的话,那么上一步就是3开始。
因为人最开始实在4的下方,只有五个方向,这个5个方向中只有两个位置可以到达-1,只有在选择第二步时需要注意,之后可达。
为了循环写的简单,我这里将,第6行人不可达的位置置为"None"
要进行上面的比较核心代码就是
if list1[i][j]+list1[i+1][j+t]>=k:
k=list1[i][j]+list1[i+1][j+t]
每一步都是一次选择,将每个数的每步最大值记录下来,不断去比较,写成循环即可。
list1=[
[16,4,3,12,6,0,3],
[4,-5,6,7,0,0,2],
[6,0,-1,-2,3,6,8],
[5,3,4,0,0,-2,7],
[-1,7,4,0,7,-5,6],
[None,-1,3,4,12,4,None]
]
list2=[
[16,4,3,12,6,0,3],
[4,-5,6,7,0,0,2],
[6,0,-1,-2,3,6,8],
[5,3,4,0,0,-2,7],
[-1,7,4,0,7,-5,6],
[0,-1,3,4,12,4,2]
]
num=[-2,-1,0,1,2]
route=[]
k=-1000
note=[[None for _ in range(8)] for _ in range(8)]
for i in range(4,-1,-1):
for j in range(7):
for t in num:
if j+t>=0 and j+t<=6 :
if list1[i+1][j+t]!=None :
if list1[i][j]+list1[i+1][j+t]>=k:
k=list1[i][j]+list1[i+1][j+t]
flag = j + t
list1[i][j]=k
k=-1000
note[i][j]=flag
for i in range(7):
if list1[0][i]>k :
k=list1[0][i]
flag=i
print("最大路径和:")
print(k)
route.append(list2[0][flag])
for i in range(5):
flag=note[i][flag]
route.insert(0,list2[i+1][flag])
print("从小到大的路径:")
print(route)
1966

被折叠的 条评论
为什么被折叠?



