这道题是一道很典型的动态规划问题,其中要求走到某点的权值和最大。从一点走到另一点直线距离不能超过3。那么我们先得出动态规划的最终条件
dp[x][y]=max(所有可能来这个点的dp值)+dp[x][y]
所以说我们就要求max里的内容
题目给的限制条件是直线距离不能超过3,那么假如在(x,y)这个点那么我只可能从减掉以下坐标的点来
direct=[(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2),(3,0)]
算这些点到(x,y)的最大值我们就可以满足最终条件
由于题目给的条件是有可能从以上减去direct的点来,那么
初始条件1:添加判断条件如果就是减去这些点坐标某个值小于0了说明不可能从这些点来,直接不加入max的讨论范围。例如第一排第二个其实只能有第一排第第一个来,其他都越界
初始条件2:如果都越界了,说明我们在(0,0)这个点也就是max讨论范围里没有数,那么就直接还是题给的初值
for may_x,may_y in direct:
lx=x-may_x
ly=y-may_y
if(lx>=0 and ly>=0):
res.append(dp[lx][ly])
if len(res)!=0:
dp[x][y]=max(res)+array[x][y]
else:
dp[x][y]=array[x][y]
DP的初始条件你要么就直接赋好值,这种只适合非常有规律那种比如第一列第一排。要么你就得通过限制条件让他在循环里赋予初值
a,b=map(int,input().strip().split())
array=[list(map(int,input().strip().split())) for i in range(a)]
dp=[[0]*b for i in range(a)]
direct=[(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2),(3,0)]
for x in range(a):
for y in range(b):
res=[]
for may_x,may_y in direct:
lx=x-may_x
ly=y-may_y
if(lx>=0 and ly>=0):
res.append(dp[lx][ly])
if len(res)!=0:
dp[x][y]=max(res)+array[x][y]
else:
dp[x][y]=array[x][y]
print(dp[-1][-1])
先接受数据,然后创建初值列表和dp,依次判断满足条件的则加入dp。
最后输出dp最右下角的值最终求解