Python 蓝桥杯 动态规划 2道例题+配套1道历年真题

简介: Python 蓝桥杯 动态规划 2道例题+配套1道历年真题

距离蓝桥杯64天  快和小郑一起准备蓝桥杯吧  

       蓝桥杯真题题目链接:数字三角形

       Leedcode青蛙跳台阶

       Leedcode不同路径

特此鸣谢这位作者的点播,小郑从中获益不少

青蛙跳台阶:(入门题)

80c1bf1319a24450847c670ce6e86289.png

思路简单:解析见代码(虽然递归超时,思想值得学习)

class Solution:
    def numWays(self, n: int) -> int:
        #dp[n]    代表跳上第n个台阶有dp[n]种跳法
        #寻找递推关系 dp[n]=dp[n-1]+dp[n-2]
        #初值dp[0]=1,dp[1]=1,dp[2]=2
        searched=[1,1,2]
        if n==0:
            return 1
        elif n==1:
            return 1
        elif n==2:
            return 2
        else:
            return self.numWays(n-1)+self.numWays(n-2)

其实仔细看就是Fibonacci数列 那就好办了😀

class Solution:
    def numWays(self, n: int) -> int:
        a,b=1,1
        for i in range(n-1):
            a,b=(a+b)%1000000007,a%1000000007
        return a

第二套代码有些细节的地方在下面这里阐述了比较清楚了,这道题只强调一个动态规划的思想:定义数组含义+递推关系+基准值

不同路径:(进阶题)


621f9a073aa74198add22c259a14488e.png

代码设计思路:


1:定义数组含义:dp[i][j]:代表到第i行j列有dp[i][j]种方法


2:寻找递推关系:类似青蛙跳台阶 由于它只能向下或向右走,故除了第一列和第一行的格子外的任意个格子,都是由上面的格子或者左边的格子跳过来的,因而类比第一题,可得递推关系:dp[i][j]=dp[i-1][j]+dp[i][j-1]


3:初值设定:由2可知,我们需要把dp[i][0](0<=i<=m-1)和dp[0][j](0<=j-1<=n)定义为1


不妨令全体dp[i][j]为1,因为反正除了第一行或第一列的dp外,都要通过递归关系更新值


1113586f18824b6986367efd504975d2.png

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp=[[1]*n for i in range(m)]
        for i in range(1,m):
            for j in range(1,n):
                dp[i][j]=dp[i-1][j]+dp[i][j-1]
        return dp[-1][-1]

蓝桥杯真题分析:数字三角形 (AC)

a88775c4efae4520a91b63d02806a2b5.png

代码设计分析:


数组定义:dp[i][j]代表第i行j列的最大路径和 由于只能左右移动 (a[i][j]代表i行j列数字)

因此递推关系: dp[i][j]=max(dp[i-1][j]+dp[i-1][j-1])+a[i][j]


初值 第0列第i行只能通过第0列第i-1行左移得到 因此可利用前缀和


2f9725c507cc44fb99ad22fe7f29e843.png


 path[i][j]记录左右移动路径,与上一层path有联系,我们定义左-1,右+1


细节补充:原三角形最右那一列的每一个元素 都可以看作由左上角的数字加0得到


因此我们对a[i][j]进行0填充  代码如下:

n=int(input())
a=[]
for _ in range(n):
    tmp=list(map(int,input().split()))
    tmp+=[0]*(n-len(tmp))
    a.append(tmp)
dp=[[0]*n for i in range(n)]
path=[[0]*n for i in range(n)]#记录左右路径 左-1 右+1
dp[0][0]=a[0][0]
for i in range(1,n):
    dp[i][0]=dp[i-1][0]+a[i][0]#初值
    path[i][0]=path[i-1][0]-1
for i in range(1,n):
    for j in range(1,n):
        #dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j]
        if dp[i-1][j]>=dp[i-1][j-1]:#由上一层左拐得到
            dp[i][j]=dp[i-1][j]+a[i][j]
            path[i][j]=path[i-1][j]-1
        else:
            dp[i][j]=dp[i-1][j-1]+a[i][j]
            path[i][j]=path[i-1][j-1]+1
ans=0
for k in range(0,n):
    if abs(path[-1][k])<=1:
        ans=max(ans,dp[-1][k])
print(ans)

我是小郑 期待与你一起奔赴热爱!冲击蓝桥杯!


相关文章
|
2月前
|
Python
蓝桥杯练习题(一):Python组之入门训练题
这篇文章是关于蓝桥杯Python组的入门训练题,包括Fibonacci数列、圆的面积、序列求和和A+B问题的具体代码实现和样例输出。
130 0
|
2月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
5月前
|
算法 开发者 Python
惊呆了!Python算法设计与分析,分治法、贪心、动态规划...这些你都会了吗?不会?那还不快来学!
【7月更文挑战第10天】探索编程巅峰,算法至关重要。Python以其易读性成为学习算法的首选。分治法,如归并排序,将大问题拆解;贪心算法,如找零问题,每步求局部最优;动态规划,如斐波那契数列,利用子问题解。通过示例代码,理解并掌握这些算法,提升编程技能,面对挑战更加从容。动手实践,体验算法的神奇力量吧!
74 8
|
5月前
|
算法 Python
算法不再难!Python分治法、贪心、动态规划实战解析,轻松应对各种算法挑战!
【7月更文挑战第8天】掌握Python算法三剑客:分治、贪心、动态规划。分治如归并排序,将大问题拆解递归解决;贪心策略在每步选最优解,如高效找零;动态规划利用子问题解,避免重复计算,解决最长公共子序列问题。实例展示,助你轻松驾驭算法!**
70 3
|
18天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
32 2
|
2月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
66 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
2月前
|
存储 算法 Python
【10月更文挑战第16天】「Mac上学Python 27」小学奥数篇13 - 动态规划入门
本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念,并解决一个经典问题:斐波那契数列。学生将学习如何使用动态规划优化递归计算,并掌握编程中的重要算法思想。
98 3
|
2月前
|
人工智能 Python
蓝桥杯练习题(四):Python组之历届试题三十题
关于蓝桥杯Python组历届试题的三十个练习题的总结,包括题目描述、输入输出格式、样例输入输出以及部分题目的解题思路和代码实现。
32 0
蓝桥杯练习题(四):Python组之历届试题三十题
|
2月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(二):Python组之基础练习三十题
蓝桥杯Python编程练习题的集合,包含了三十个不同难度的编程题目,覆盖了基础语法、数据结构和算法等领域。
34 0
|
5月前
|
算法 Python
Python算法高手进阶指南:分治法、贪心算法、动态规划,掌握它们,算法难题迎刃而解!
【7月更文挑战第10天】探索Python算法的精华:分治法(如归并排序)、贪心策略(如找零钱问题)和动态规划(解复杂问题)。通过示例代码揭示它们如何优化问题解决,提升编程技能。掌握这些策略,攀登技术巅峰。
126 2