跳跃-蓝桥杯真题-python解法动态规划dp

题目描述

解题思路

这道题是一道很典型的动态规划问题,其中要求走到某点的权值和最大。从一点走到另一点直线距离不能超过3。那么我们先得出动态规划的最终条件

DP动态规划的最终条件

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)的最大值我们就可以满足最终条件

DP初始条件

由于题目给的条件是有可能从以上减去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最右下角的值最终求解

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值