算法学习4——动态规划

动态规划(Dynamic Programming,简称DP)是一种用于解决具有重叠子问题和最优子结构性质的问题的算法设计技术。它通过将复杂问题分解为更小的子问题,并保存子问题的解来避免重复计算,从而提高算法的效率。

基本思想

动态规划的核心思想是将问题分解成子问题,并通过存储子问题的解来避免重复计算。这一思想可以通过两种方式实现:

  1. 自顶向下的备忘录法(Top-Down with Memoization):递归解决问题,并将已计算的结果存储在备忘录中,以便后续使用。
  2. 自底向上的动态规划法(Bottom-Up Dynamic Programming):从最小的子问题开始,逐步构建出较大的子问题的解。

步骤

  1. 定义子问题:将原问题分解为若干个子问题。
  2. 确定状态转移方程:找出子问题之间的关系,建立递推公式。
  3. 确定初始条件和边界情况:设定最小子问题的解。
  4. 自底向上计算:利用递推公式计算子问题的解,最终得到原问题的解。

经典问题及代码示例

下面是三个关于动态规划的经典问题,可以帮助理解动态规划这一概念。

1. 斐波那契数列

问题描述:斐波那契数列的定义如下:F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2)。

动态规划实现步骤

  1. 定义子问题:F(n)表示第n个斐波那契数。
  2. 确定状态转移方程:F(n) = F(n-1) + F(n-2)。
  3. 确定初始条件和边界情况:F(0) = 0, F(1) = 1。
  4. 自底向上计算
    • 初始化一个数组dp,长度为n+1。
    • 将dp[0]设为0,dp[1]设为1。
    • 从2开始到n,逐步计算dp[i] = dp[i-1] + dp[i-2]。
    • 返回dp[n]。

Python代码

def fibonacci(n):if n <= 1:return ndp = [0] * (n + 1)dp[1] = 1for i in range(2, n + 1):dp[i] = dp[i - 1] + dp[i - 2]return dp[n]# 示例
print(fibonacci(10))  # 输出 55
2. 最长公共子序列

问题描述:给定两个字符串,找到它们的最长公共子序列的长度。

动态规划实现步骤

  1. 定义子问题:设dp[i][j]表示text1[0]和text2[0]的最长公共子序列长度。
  2. 确定状态转移方程
    • 如果text1[i-1] == text2[j-1],则dp[i][j] = dp[i-1][j-1] + 1。
    • 否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])。
  3. 确定初始条件和边界情况:dp[0][]和dp[][0]均为0,因为空字符串的最长公共子序列长度为0。
  4. 自底向上计算
    • 初始化一个二维数组dp,大小为(m+1) x (n+1)。
    • 遍历所有i和j,根据状态转移方程更新dp[i][j]。
    • 最终返回dp[m][n]。

Python代码

def longest_common_subsequence(text1, text2):m, n = len(text1), len(text2)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]# 示例
text1 = "abcde"
text2 = "ace"
print(longest_common_subsequence(text1, text2))  # 输出 3
3. 0/1 背包问题

问题描述:给定一组物品,每个物品有一个重量和一个价值,在满足背包容量限制的情况下,选择物品使得总价值最大。

动态规划实现步骤

  1. 定义子问题:设dp[i][w]表示前i个物品在容量为w的背包中的最大价值。
  2. 确定状态转移方程
    • 如果第i个物品的重量小于等于w,则dp[i][w] = max(dp[i-1][w], dp[i-1][w-weights[i-1]] + values[i-1])。
    • 否则,dp[i][w] = dp[i-1][w]。
  3. 确定初始条件和边界情况:dp[0][]和dp[][0]均为0,因为没有物品或容量为0时,最大价值为0。
  4. 自底向上计算
    • 初始化一个二维数组dp,大小为(n+1) x (capacity+1)。
    • 遍历所有i和w,根据状态转移方程更新dp[i][w]。
    • 最终返回dp[n][capacity]。

Python代码

def knapsack(weights, values, capacity):n = len(weights)dp = [[0] * (capacity + 1) for _ in range(n + 1)]for i in range(1, n + 1):for w in range(1, capacity + 1):if weights[i - 1] <= w:dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1])else:dp[i][w] = dp[i - 1][w]return dp[n][capacity]# 示例
weights = [1, 2, 3]
values = [10, 15, 40]
capacity = 5
print(knapsack(weights, values, capacity))  # 输出 55

总结

动态规划是一种强大的算法设计技术,适用于解决许多复杂的最优化问题。通过将问题分解为子问题,并利用存储子问题解的方式来避免重复计算,动态规划可以显著提高计算效率。本文介绍了动态规划的基本思想、实现步骤,以及几个经典问题的Python代码示例。掌握动态规划技巧,将有助于你在编程竞赛和实际项目中解决更多复杂的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mamba中的Mamba:在标记化Mamba模型中的集中式Mamba跨扫描高光谱图像分类

摘要 https://arxiv.org/pdf/2405.12003 高光谱图像&#xff08;HSI&#xff09;分类在遥感&#xff08;RS&#xff09;领域至关重要&#xff0c;尤其是随着深度学习技术的不断进步。顺序模型&#xff0c;如循环神经网络&#xff08;RNNs&#xff09;和Transformer&#xff0…

接近50个实用编程相关学习资源网站

Date: 2024.07.17 09:45:10 author: lijianzhan 编程语言以及编程相关工具等实用性官方文档网站 C语言文档&#xff1a;https://learn.microsoft.com/zh-cn/cpp/c-languageMicrosoft C、C和汇编程序文档&#xff1a;https://learn.microsoft.com/zh-cn/cppJAVA官方文档&#…

java题目之数字加密以及如何解密

public class Main6 {public static void main(String[] args) {// 某系统的数字密码&#xff08;大于0&#xff09;&#xff0c;比如1983&#xff0c;采用加密方式进行传输//定义了一个静态数组int []arr{1,9,8,3};//1.加密//先给每位数加上5for (int i 0; i <arr.length …

随机变量的数学期望

目录 简介 基本概念 数学期望的定义 数学期望的性质 数学期望的应用 计算实例 数学期望在解决哪些具体问题时最为有效&#xff1f; 如何计算两个或多个随机变量的组合概率及其期望值&#xff1f; 1. 计算组合概率 2. 计算期望值 当涉及到两个或多个随机变量的组合时&…

Hadoop基础组件介绍!

Hadoop是一个由Apache基金会所开发的分布式系统基础架构&#xff0c;Hadoop生态系统已经远远超出了这些基本组件&#xff0c;现在包括了多种组件和技术&#xff0c;详情介绍如下&#xff1a; HDFS&#xff08;Hadoop Distributed File System&#xff09; HDFS是Hadoop的核心组…

git实操之线上分支合并

线上分支合并 【 1 】本地dev分支合并到本地master上 # 本地dev分支合并到本地master上# 远程(线上)分支合并# 本地dev分支合并到本地master上# 远程(线上)分支合并#####本地和线上分支同步################ #### 远程创建分支&#xff0c;拉取到本地####-远程创建分支&#…

自定义Bean转换工具类

BeanConvertor工具类&#xff1a;简化Java对象转换的利器 在Java开发中,我们经常需要在不同的对象之间转换数据。这可能是因为我们需要将数据从一个层(如数据访问层)转移到另一个层(如服务层或表示层),或者是因为我们需要将外部API的数据结构转换为我们的内部数据结构。这种转…

企业级-PDF图片水印

作者&#xff1a;fyupeng 技术专栏&#xff1a;☞ https://github.com/fyupeng 项目地址&#xff1a;☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 遇到签名&#xff0c;往往很无奈签名的位置、大小。 一、介绍 直接提供PDF路径和图片路径&#xff0…

RK RGA _MMU unsupported memory larger then 4G!问题解决

使用RGA程序,长时间运行的过程中出现了rga_mm: RGA_MMU unsupported memory larger than 4G! rga_mm: RGA_MMU unsupported memory larger than 4G! rga_mm: scheduler core[4] unsupported mm_flag[0x8]! rga_mm: rga_mm_map_buffer map virtual address error! rga_mm: job…

华为云.云日志服务LTS及其基本使用

云计算 云日志服务LTS及其基本使用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550…

2024最新版虚拟便携空调小程序源码 支持流量主切换空调型号

产品截图 部分源代码展示 urls.js Object.defineProperty(exports, "__esModule", {value: !0 }), exports.default ["9c5f1fa582bee88300ffb7e28dce8b68_3188_128_128.png", "E-116154b04e91de689fb1c4ae99266dff_960.svg", "573eee719…

酱酒七个轮次口感与特点,哪个轮次最好喝?

都知道酱香型白酒是按照“12987”工艺酿造而成,这12987便是以一整年为一个生产周期,中间经历润沙下沙,并在多次的蒸煮发酵后,完成七次取酒。 所以酱香型白酒是由7个轮次的基酒勾调而成的,这七轮次酒口感特点各不相同,品质也是有着极大的差异。而这各个轮次基酒的勾调配比又直接…

【踩坑日记26】Connection timed out fatal: expected flush after ref listing ```

问题描述 (base) XXXomega:/home/XXX/code$ git clone https://github.com/comeeasy/DALS.git Cloning into DALS... error: RPC failed; curl 28 Failed to connect to github.com port 443: Connection timed out fatal: expected flush after ref listing解决方法 直接换一…

mysql的索引、事务和存储引擎

目录 索引 索引的概念 索引的作用 作用 索引的副作用 创建索引 创建索引的原则和依据 索引的类型 创建索引 查看索引 删除索引 drop 主键索引 普通索引 添加普通索引 唯一索引 添加唯一索引 组合索引 添加组合索引 查询组合索引 全文索引 添加全文索引 …

构建高效Node.js中间层:探索请求合并转发的艺术

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【CSS盒模型&#xff1a;掌握网页布局的核心】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐评论✍ 引言&#x…

深度学习简介(框架)

目录 1. 深度学习简介1.1 历史背景1.2 核心原理1.3 应用领域1.4 技术挑战1.5 未来趋势 2. 深度学习与传统机器学习2.1 深度学习的原理2.2 深度学习的优势2.3 深度学习的应用2.4 深度学习的挑战2.5 深度学习的未来 3. 深度学习的关键技术3.1 神经网络基础3.2 卷积神经网络&#…

java中的常量池

类文件常量池 类文件结构概览 一个Java类文件的大致结构如下&#xff1a; 魔数&#xff08;Magic Number&#xff09;&#xff1a;标识文件类型&#xff0c;值为0xCAFEBABE。 版本号&#xff08;Version&#xff09;&#xff1a;次版本号和主版本号。 常量池&#xff08;Cons…

接口测试JMeter-1.接口测试初识

第一章 接口测试初识 1. 接口测试理论基础 “接口测试”一个让人觉得非常高大上的名词&#xff0c;特别是对于刚入门的测试同学而言。随着测试技术不断的深化&#xff0c;“接口测试”出现在我们视野中的频次越来越高。那么接口测试到底是如何做的&#xff1f;接口测试的优势又…

Flowable-SpringBoot项目集成

在前面的介绍中&#xff0c;虽然实现了绘制流程图&#xff0c;然后将流程图存储到数据库中&#xff0c;然后从数据库中获取流程信息&#xff0c;并部署和启动流程&#xff0c;但是部署的流程绘制器是在tomcat中部署的&#xff0c;可能在部分的项目中&#xff0c;需要我们将流程…

Windows图形界面(GUI)-DLG-C/C++ - 月历控件(MonthCalendar)

公开视频 -> 链接点击跳转公开课程博客首页 -> e​​​​​​链接点击跳转博客主页 目录 月历控件(MonthCalendar) 使用场景 控件操作 月历控件(MonthCalendar) 使用场景 日程安排&#xff1a;用户可以通过月历控件选择特定的日期来安排会议或活动。事件管理&#x…