news 2026/5/30 21:11:10

动态规划详解:从入门到精通

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态规划详解:从入门到精通

一、什么是动态规划
动态规划(Dynamic Programming,简称DP)是一种将复杂问题分解为更小的子问题来求解的算法思想。它特别适用于具有重叠子问题和最优子结构性质的问题。

核心思想
分解问题:将原问题分解为若干个子问题

存储中间结果:避免重复计算子问题

构建最终解:从子问题的解构建原问题的解

二、动态规划的核心要素

  1. 最优子结构
    一个问题的最优解包含其子问题的最优解。

示例:最短路径问题

如果从A到C的最短路径经过B,那么从A到B和从B到C的路径也分别是各自的最短路径。

  1. 重叠子问题
    在递归求解过程中,相同的子问题会被多次计算。

示例:斐波那契数列

计算F(5)需要计算F(4)和F(3)

计算F(4)需要计算F(3)和F(2)

F(3)被重复计算

三、动态规划的两种实现方法

  1. 自顶向下(记忆化搜索,Memoization)
deffibonacci_memoization(n,memo=None):"""自顶向下:记忆化搜索"""ifmemoisNone:memo={}# 如果已经计算过,直接返回ifninmemo:returnmemo[n]# 基本情况ifn<=1:returnn# 递归计算并存储结果memo[n]=fibonacci_memoization(n-1,memo)+fibonacci_memoization(n-2,memo)returnmemo[n]# 测试print("斐波那契数列(记忆化搜索):")foriinrange(10):print(f"F({i}) ={fibonacci_memoization(i)}")
  1. 自底向上(制表法,Tabulation)
deffibonacci_tabulation(n):"""自底向上:制表法"""ifn<=1:returnn# 创建DP表dp=[0]*(n+1)dp[1]=1# 填充DP表foriinrange(2,n+1):dp[i]=dp[i-1]+dp[i-2]returndp[n]deffibonacci_optimized(n):"""空间优化的斐波那契"""ifn<=1:returnn prev2,prev1=0,1# F(0), F(1)foriinrange(2,n+1):current=prev1+prev2 prev2,prev1=prev1,currentreturnprev1# 测试print("\n斐波那契数列(制表法):")foriinrange(10):print(f"F({i}) ={fibonacci_tabulation(i)}")

四、经典动态规划问题

  1. 0-1背包问题
defknapsack_01(weights,values,capacity):""" 0-1背包问题 weights: 物品重量列表 values: 物品价值列表 capacity: 背包容量 """n=len(weights)# 创建DP表:dp[i][w]表示前i个物品在容量w下的最大价值dp=[[0]*(capacity+1)for_inrange(n+1)]# 填充DP表foriinrange(1,n+1):forwinrange(1,capacity+1):# 如果不选第i个物品dp[i][w]=dp[i-1][w]# 如果选第i个物品(前提是容量足够)ifweights[i-1]<=w:dp[i][w]=max(dp[i][w],dp[i-1][w-weights[i-1]]+values[i-1])# 回溯找出选择的物品selected_items=[]w=capacityforiinrange(n,0,-1):ifdp[i][w]!=dp[i-1][w]:selected_items.append(i-1)w-=weights[i-1]returndp[n][capacity],selected_items[::-1]# 测试weights=[2,3,4,5]values=[3,4,5,6]capacity=8max_value,items=knapsack_01(weights,values,capacity)print(f"\n0-1背包问题:")print(f"最大价值:{max_value}")print(f"选择的物品索引:{items}")
  1. 最长公共子序列(LCS)
deflongest_common_subsequence(text1,text2):""" 最长公共子序列 返回LCS的长度和序列 """m,n=len(text1),len(text2)# dp[i][j]表示text1[0:i]和text2[0:j]的LCS长度dp=[[0]*(n+1)for_inrange(m+1)]# 填充DP表foriinrange(1,m+
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 19:50:14

朱炳仁、朱军岷14件铜艺捐赠入藏中国国家博物馆

2025年12月12日&#xff0c;朱炳仁、朱军岷作品捐赠入藏仪式在中国国家博物馆白玉厅隆重举行。这对国内罕见的“一门双国遗”父子传承人&#xff0c;将14件艺术珍品悉数捐赠给国博。这标志着朱炳仁首创的熔铜艺术&#xff0c;自2007年首件作品入藏国博后&#xff0c;历经18年沉…

作者头像 李华
网站建设 2026/5/29 20:17:19

数字化饮食闭环管理新趋势:AI技术如何重塑个性化营养方案

随着健康中国战略的深入推进&#xff0c;企业健康管理正迎来数字化转型升级的重要机遇。在员工健康管理领域&#xff0c;传统的饮食指导方式已难以满足精准化、个性化的需求。在此背景下&#xff0c;数字化饮食闭环管理作为一种创新模式&#xff0c;通过数据采集、智能分析、方…

作者头像 李华
网站建设 2026/5/29 20:23:51

AutoGPT+GPU云服务无限扩展的智能执行能力

AutoGPT 与 GPU 云服务&#xff1a;构建无限扩展的智能执行系统 在生成式 AI 的浪潮中&#xff0c;我们正经历一场从“对话工具”到“自主代理”的深刻变革。过去&#xff0c;用户需要一步步指导 AI 完成任务——“写一段介绍”、“搜索某项数据”、“总结这篇文档”。而今天&a…

作者头像 李华
网站建设 2026/5/29 20:24:46

Vim 标签页(Tab)操作详解

Vim 标签页&#xff08;Tab&#xff09;操作详解&#x1f4da; 标签页基础1. 创建标签页:tabnew [文件名] " 在新标签页打开文件 :tabedit [文件名] " 同上&#xff0c;在新标签页编辑文件 :tabe [文件名] " 简写形式" 从命令行直接…

作者头像 李华
网站建设 2026/5/29 20:37:29

学术突围新路径:书匠策AI如何成为毕业论文的“隐形导师“?

在高校图书馆的深夜灯光下&#xff0c;总有一群人对着电脑屏幕抓耳挠腮&#xff1a;文献综述像一团乱麻&#xff0c;实验数据在表格里打架&#xff0c;参考文献格式总在APA和GB之间反复横跳。这些场景&#xff0c;构成了无数毕业生挥之不去的"论文焦虑"。而今&#x…

作者头像 李华
网站建设 2026/5/29 19:45:49

K8s-1.29.2二进制安装-第一章

从本章来完成安装k8s学习的最后一种安装方式(二进制安装)&#xff0c;系统使用Rockly9.6&#xff0c;K8s版本1.29.2&#xff0c;一共会分成几张进行编写。1. 安装Topo2.环境初始化 1、镜像下载(所有节点) # 官方下载地址 https://rockylinux.org/download # 阿里云镜像下载地址…

作者头像 李华