news 2026/6/23 19:00:13

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

作者头像

张小明

前端开发工程师

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/6/23 18:56:34

Stable Diffusion AIGC 视觉设计实战教程之 07-图生图

图生图生成逻辑 图生图生成逻辑概述 Stable Diffusion 图生图技术的底层逻辑主要基于深度学习&#xff0c;特别是生成对抗网络&#xff08;GAN&#xff09;和扩散模型&#xff08;Diffusion Model&#xff09;的结合&#xff0c;其核心思想是通过训练大量的数据来让模型学习如何…

作者头像 李华
网站建设 2026/6/23 10:48:36

当毕业论文不再是“一个人的深夜战场”:一位研究生眼中的AI科研协作者如何重塑写作流程

凌晨两点&#xff0c;寝室只剩下电脑屏幕的微光。你盯着文档里那句改了八遍的引言&#xff0c;焦虑感像潮水般涌来——文献综述逻辑松散、方法描述不够严谨、讨论部分缺乏深度……这不是某一个人的困境&#xff0c;而是每年数百万毕业生共同面对的“写作黑洞”。但最近&#xf…

作者头像 李华
网站建设 2026/6/23 17:17:35

统计提交svn代码行数,文件以及文档

本文介绍了如何使用Java开发一个小工具&#xff0c;以统计指定时间段内SVN用户提交的代码行数、文件数量以及文档变化。通过svn log和svn diff命令结合&#xff0c;实现对SVN提交记录的分析&#xff0c;满足对人员工作量可视化的需要。下面简述下自己的开发思想。 一。核心是sv…

作者头像 李华
网站建设 2026/6/23 18:54:14

解锁学术新次元:书匠策AI科研工具为毕业论文注入智慧动能

在学术研究的浩瀚宇宙中&#xff0c;毕业论文宛如一颗璀璨星辰&#xff0c;既承载着学子们对知识的深度探索&#xff0c;又见证着他们从青涩走向成熟的学术蜕变。然而&#xff0c;这条通往星辰的征途并非坦途&#xff0c;选题迷茫、逻辑混乱、内容匮乏、格式繁杂等问题&#xf…

作者头像 李华
网站建设 2026/6/23 2:55:46

GPT-5.2全面解析:AI“打工能力“大提升,程序员职场必备技能

OpenAI最新发布的GPT-5.2模型在30天内快速迭代&#xff0c;重点强化"打工能力"。通过实际测试&#xff0c;GPT-5.2在Excel处理、客服问题解决、超长文档处理等方面表现优异。GDPval测试显示其在74%的任务中达到或超过人类专家水平&#xff0c;且速度比人类快11倍。更…

作者头像 李华
网站建设 2026/6/23 18:55:54

vue-springboot基于Java医院药品管理系统的设计与实现_8z88u88g

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华