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

题目描述

跳跃-蓝桥杯真题-python解法动态规划dp_第1张图片

解题思路

这道题是一道很典型的动态规划问题,其中要求走到某点的权值和最大。从一点走到另一点直线距离不能超过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最右下角的值最终求解

你可能感兴趣的:(动态规划,算法,蓝桥杯,算法,python,动态规划,leetcode)