跳跃/经典动归/棋盘不同走向的表示模板

题解:

可以看出此题是动态规划,不同于股票系列、打家劫舍、背包系列、子序列问题,这里又包含着深搜回溯中的棋盘走向问题,故这里需要回忆一下期盼问题中不同走向的表示方法:

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:#判断上一步坐标是否在棋盘内
        执行语句

这里需要注意三点:

  1. 起点不参与递推:if i==0 and j==0:continue
  1. 需要判断上一步(下一步)坐标是否在棋盘内,不要超出:
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])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值