

题解:
可以看出此题是动态规划,不同于股票系列、打家劫舍、背包系列、子序列问题,这里又包含着深搜回溯中的棋盘走向问题,故这里需要回忆一下期盼问题中不同走向的表示方法:
dire = [[0, -1], [0, -2], [0, -3], [-1, 0], [-1, -1], [-1, -2], [-2, 0], [-2, -1], [-3, 0]]#深搜中棋盘走不同方向的常用表示方法
n, m = map(int, input().split())
for i in range(n):
for j in range(m):
if i==0 and j==0:continue#起点不参与递推
for dir in dire:
dx,dy=dir[0],dir[1]#这里是常用的回溯棋盘不同方向走向的表示方法
a=i+dx
b=j+dy
if 0<=a<=n and 0<=b<=m:#判断上一步坐标是否在棋盘内
执行语句
这里需要注意三点:
起点不参与递推:if i==0 and j==0:continue
需要判断上一步(下一步)坐标是否在棋盘内,不要超出:
if 0<=nx <=n and 0<=ny<=m:
执行语句
而且我们这里根据每个总权值由九个合法的移动方向带来的总权值中最大的,加上它本身,推出结果
故:
import os
import sys
# 请在此输入您的代码
dire = [[0, -1], [0, -2], [0, -3], [-1, 0], [-1, -1], [-1, -2], [-2, 0], [-2, -1], [-3, 0]]#深搜中棋盘走不同方向的常用表示方法
n, m = map(int, input().split())
nums=[[0]*m for i in range(n)]
for i in range(n):
nums[i]=list(map(int,input().split()))
dp=[[-19999999999]*m for i in range(n)]#因为权值中有负数,故初始化应设为负无穷
dp[0][0]=nums[0][0]
for i in range(n):
for j in range(m):
if i==0 and j==0:continue#起点不参与递推
for dir in dire:
dx,dy=dir[0],dir[1]#这里是常用的回溯棋盘不同方向走向的表示方法
a=i+dx
b=j+dy
if 0<=a<=n and 0<=b<=m:#判断上一步坐标是否在棋盘内
dp[i][j]=max(dp[a][b],dp[i][j])
dp[i][j]+=nums[i][j]#就相当于每个总权值由九个合法的移动方向带来的总权值中最大的,加上它本身,推出结果
print(dp[-1][-1])