蓝桥杯Python赛道备赛——Day7:动态规划(基础)

embedded/2025/3/19 4:40:19/

   本博客就蓝桥杯中所涉及的动态规划基础问题进行讲解,包括:递推、记忆化搜索、最长公共子序列(LCS)和最长上升子序列(LIS)。

   每一种动态规划问题都在给出定义的同时,给出了其求解方法的示例代码,以供低年级师弟师妹们学习和练习。

   前序知识:
(1)Python基础语法


动态规划(基础)

      • 一、递推(迭代法)
      • 二、记忆化搜索(递归+缓存)
      • 三、最长公共子序列(LCS)
      • 四、最长上升子序列(LIS)

一、递推(迭代法)

  1. 定义:通过已知子问题的解逐步推导出更大问题的解,避免重复计算。

  2. 适用问题:具有明确递推公式的问题(如斐波那契数列)。

  3. 算法原理:

    • 确定基础情况
    • 建立状态转移方程
    • 自底向上迭代计算
  4. 示例代码:

python"># 递推
# 实现斐波那契数列
def fib(n):dp = [0] * (n+1)  # 创建一个数组,大小为n+1dp[1] = 1  # 初始条件,第一个斐波那契数为1for i in range(2, n+1):dp[i] = dp[i-1] + dp[i-2]  # 当前的数等于前两个数之和return dp[n]  # 返回第n个斐波那契数# 测试
print(fib(10))  # 输出第10个斐波那契数

二、记忆化搜索(递归+缓存)

  1. 定义:通过缓存已计算结果优化递归算法。

  2. 适用问题:递归结构清晰但存在重复计算的问题。

  3. 算法原理:

    • 创建缓存字典
    • 递归前先查询缓存
    • 计算结果存入缓存
  4. 示例代码:

python"># 记忆化搜索
# 实现斐波那契数列
def memo_fib(n, memo={}):# 基础情况处理if n <= 1:return n# 检查是否已计算过if n not in memo:# 递归计算并存储结果memo[n] = memo_fib(n-1, memo) + memo_fib(n-2, memo)return memo[n]# 测试:获取第10个斐波那契数
print(memo_fib(10))  # 输出:55

三、最长公共子序列(LCS)

  1. 定义:两个序列共有的最长子序列(不要求连续)。

  2. 适用问题:DNA比对、文本相似度分析。

  3. 算法原理:
    (1)创建二维DP表。
    (2)状态转移方程:
             - 当字符相等:dp[i][j] = dp[i-1][j-1] + 1
             - 当字符不等:dp[i][j] = max(dp[i-1][j], dp[i][j-1])

  4. 示例代码:

python"># 最长公共子序列
def lcs(text1, text2):m, n = len(text1), len(text2)# 创建(m+1)x(n+1)的DP表(包含空字符串情况)dp = [[0]*(n+1) for _ in range(m+1)]for i in range(1, m+1):for j in range(1, n+1):if text1[i-1] == text2[j-1]:  # 字符匹配的情况dp[i][j] = dp[i-1][j-1] + 1else:  # 字符不匹配的情况dp[i][j] = max(dp[i-1][j], dp[i][j-1])return dp[m][n]# 测试用例
text_a = "ABCBDAB"
text_b = "BDCAB"
print(lcs(text_a, text_b))  # 输出:4(对应"BCAB"或"BDAB")

四、最长上升子序列(LIS)

  1. 定义:序列中数值严格递增的最长子序列。

  2. 适用问题:股票趋势分析、课程安排。

  3. 算法原理:
    (1)维护每个位置的最长上升序列长度。
    (2)状态转移方程:
             dp[i] = max(dp[j]+1) 当nums[j] < nums[i](j < i)

  4. 示例代码:

python"># 最长递增子序列
def length_of_lis(nums):if not nums:return 0n = len(nums)dp = [1] * n  # 每个元素自身构成长度为1的序列for i in range(n):# 检查前面所有可能形成上升序列的位置for j in range(i):if nums[j] < nums[i]:dp[i] = max(dp[i], dp[j]+1)return max(dp)# 测试用例
nums = [10,9,2,5,3,7,101,18]
print(length_of_lis(nums))  # 输出:4(对应[2,5,7,101])

http://www.ppmy.cn/embedded/173765.html

相关文章

【从零开始学习计算机科学】设计模式(五)MVC模式、业务代表模式、组合实体模式、数据访问对象模式、前端控制器模式、拦截过滤器模式、服务定位器模式、传输对象模式

【从零开始学习计算机科学】设计模式(五)MVC模式、业务代表模式、组合实体模式、数据访问对象模式、前端控制器模式、拦截过滤器模式、服务定位器模式、传输对象模式 MVC模式主要组件工作原理优点缺点适用场景总结业务代表模式主要特点组成部分工作原理优点缺点适用场景总结组…

嵌入式硬件篇---龙芯GPIO控制

文章目录 前言1. 头文件引入作用 2. 导出GPIO引脚 export_gpio功能示例注意 3. 设置GPIO方向 set_gpio_direction功能示例 4. 设置GPIO值 set_gpio_value功能示例 5. 初始化函数 gpio_init功能 6.龙芯2K1000适配说明6.1 GPIO编号映射6.2 性能优化建议优点错误处理 6.3 权限问题…

大数据技术之Spark优化

第 1 章 Spark 性能调优 问:spark 优化 第一句:我们可以从性能,算子,shuffle 过程以及 jvm 四个方面展开优化。 1 常规性能调优 1.1 常规性能调优一:最优资源配置 Spark 性能调优的第一步,就是为任务分配更多的资源,在一定范围内,增加资源的分配与性能的提升是成正…

蓝桥杯备考:01背包+dfs---》搭配购买

我们可以把搭配的那些云当作一个一个的连通块&#xff0c;然后把这些连通快当成每个物体 比如&#xff0c;本题就是两个连通块 当我们做好连通块儿的时候&#xff0c;我们分析一下01背包 step1 分析状态表示 f[i][j]表示 从1到i个物品选出价格不超过j的最大价值 step2:推导状…

uniapp中使用webview并与原页面通信

uniapp中使用webview并与原页面通信 1.接收数据 主要使用message与onPostMessage接收原页面数据&#xff0c;且两个方法只能在APP中使用&#xff0c;其他平台均不支持。 <web-view style"z-index: 1;" :src"webViewUrlappview" onPostMessage"h…

StarRocks SQL使用与MySql的差异及规范注意事项

StarRocks为OLAP列存数据库&#xff0c;擅长复杂分析查询&#xff0c;需显式定义分区/分桶键&#xff1b;MySQL为OLTP行存数据库&#xff0c;适合事务处理。SQL差异&#xff1a;StarRocks支持批量写入&#xff08;避免单行INSERT&#xff09;、物化视图优化&#xff0c;禁用LIM…

R语言的安全编码

R语言的安全编码实践 引言 在数据科学和统计分析的快速发展中&#xff0c;R语言成为了一种广泛使用的工具。虽然R语言为数据分析提供了强大的功能&#xff0c;但在编写R代码时&#xff0c;安全性常常被忽视。安全编码不仅关乎软件的稳定性和可靠性&#xff0c;还涉及到数据隐…

unreal engine5 mation warping使用,敌人受击后面向攻击者

UE5系列文章目录 文章目录 UE5系列文章目录前言一、Motion Warping是什么&#xff1f;二、使用步骤 前言 unreal engine5 mation warping使用&#xff0c;敌人受击后面向攻击者 一、Motion Warping是什么&#xff1f; 在Unreal Engine 5中&#xff0c;**Motion Warping&…