动态规划的特征

【算法】可用动态规划求解的问题的基本特征 对于动态规划思想,每一个刚刚接触的人都会都会十分不解,哪些问题可以用动态规划思想求解呢?最近一直在学习动态规划,书中也讲了好多关于能用动态规划求解问题的特征,根据自己的想法,我总结了以下几个可以用动态规划的问题的基本特征: 1,最优子结构 母问题的最优解包含其子问题的最优解,我们就称此问题具有最优子结构。即也就是说,子问题最优时,母问题通过优化一定能求得最优解 2,子问题重叠 子问题本质上 阅读详情

本文并非面向初学动态规划的读者,而是面向对动态规划已有了解的读者,并结合我阅读文献[1]的认识做一简单的总结。

讨论背景

为了方便后文举例,此处叙述一下0-1背包问题的定义:

给定一个背包容量W,以及一系列物品 { I 1 , I 2 , . . . , I n } \{I_1, I_2, ... , I_n\} {I1​,I2​,...,In​};每个物品有各自的重量和价值。要求在背包装得下的情况下,从这一系列物品中选出价值最大的一个组合。
答案用一个数组 C [ 1 : n ] C[1:n] C[1:n]表示, C [ s ] C[s] C[s]只取0或1,分别表示不选 I s I_s Is​或选择 I s I_s Is​。

例如,当W=5,且每个物品的情况如下表所示时,最优选择为 C = { 0 , 1 , 1 } C=\{0, 1, 1\} C={0,1,1},即只选择物品2和3(该例来自文献[1]383页的Figure 16.2,我将单位改了一下):

物品重量价值
I 1 I_1 I1​16
I 2 I_2 I2​210
I 3 I_3 I3​312

分治特点

虽然我们说起分治策略时,通常想到的是快速排序、二分查找这样的算法,但动态规划实际上也具有分而治之的色彩,只不过不明显。

例如,对于背包问题,我们可以按顺序依次考虑每个物品。当 C [ 1 ] = 0 C[1]=0 C[1]=0时,所得的子问题是, W = 5 W=5 W=5,考虑的物品则剩下 { I 2 , . . . , I n } \{ I_2, ... , I_n\} {I2​,...,In​},将这个子问题表示为 P s 0 P_{s0} Ps0​;当 C [ 1 ] = 1 C[1]=1 C[1]=1时,所得的子问题是, W = 5 − 1 = 4 W=5-1=4 W=5−1=4,考虑的物品则是 { I 2 , . . . , I n } \{ I_2, ... , I_n\} {I2​,...,In​},将这个子问题表示为 P s 1 P_{s1} Ps1​。

与快速排序不同的是,不论 C [ 1 ] C[1] C[1]做何选择,都只能得到一个子问题:要么是 P s 0 P_{s0} Ps0​,要么是 P s 1 P_{s1} Ps1​;与快速排序相同的是,这个子问题比原问题的规模更小,因为,至少我们要考虑的物品已经减少了一个。

实际上,在文献[1]的15.2节的矩阵链乘法(Matrix-chain multiplication)中,每一次确实会划分出两个规模更小的子问题。

最优子结构

还是考虑背包问题。设原问题为 P o P_o Po​,假如我们能为 C [ 1 ] C[1] C[1]做出合适的选择,那么就会得到一个规模更小的子问题 P s P_{s} Ps​,它可能是 P s 0 P_{s0} Ps0​或 P s 1 P_{s1} Ps1​。既然 P o P_o Po​的解用数组 C [ 1 : n ] C[1:n] C[1:n]来表示,那么在做出选择 C [ 1 ] C[1] C[1]之后,待定的就是 C [ 2 : n ] C[2:n] C[2:n],而这一部分正对应着子问题 P s P_{s} Ps​的解。

如果说 C [ 1 : n ] C[1:n] C[1:n]是 P o P_o Po​的一个最优解,那么 C [ 2 : n ] C[2:n] C[2:n]必然是 P s P_{s} Ps​的一个最优解。否则,假如说 C [ 2 : n ] ′ C[2:n]^\prime C[2:n]′更优,那么将 C [ 1 : n ] = C [ 1 ] + C [ 2 : n ] C[1:n]=C[1]+C[2:n] C[1:n]=C[1]+C[2:n]改写为 C [ 1 : n ] ′ = C [ 1 ] + C [ 2 : n ] ′ C[1:n]^\prime=C[1]+C[2:n]^\prime C[1:n]′=C[1]+C[2:n]′之后, C [ 1 : n ] ′ C[1:n]^\prime C[1:n]′将是一个比 C [ 1 : n ] C[1:n] C[1:n]更优的解,这就与“ C [ 1 : n ] C[1:n] C[1:n]是 P o P_o Po​的一个最优解”这一断言相悖。

这种原问题的最优解包含了子问题的最优解的性质,就是动态规划的标志性特征。说到这里,也许你会觉得这很像贪婪策略。没错,贪婪策略可以说是动态规划的一个特例,但是动态规划有它自己的独特之处,以至于用贪婪策略那种方式来解动态规划问题的话,虽然可以得到正确结果,但时间复杂度却高到不可接受。

自底向上求解

假如用贪婪策略那种自顶向下递归求解的方法,那么我们首先要分别考虑 C [ 1 ] = 0 C[1]=0 C[1]=0和 C [ 1 ] = 1 C[1]=1 C[1]=1的情况,分别导致 P s 0 P_{s0} Ps0​和 P s 1 P_{s1} Ps1​这两个子问题。但是通常情况下,我们没有足够的信息马上判断出来是选择 C [ 1 ] = 0 C[1]=0 C[1]=0并将问题化解为 P s 0 P_{s0} Ps0​更好,还是选择 C [ 1 ] = 1 C[1]=1 C[1]=1并将问题化解为 P s 1 P_{s1} Ps1​更好。因此必须将 P s 0 P_{s0} Ps0​和 P s 1 P_{s1} Ps1​都解决掉,然后比较两种选择所获得的价值。从这里立刻就可见动态规划与贪婪策略的不同之一:贪婪策略往往在解决子问题之前,就能给出一个贪婪选择,但动态规划则需要所有子问题的完整信息才能做出一个最优选择。

P s 0 P_{s0} Ps0​和 P s 1 P_{s1} Ps1​这两个子问题的共同之处就是它们要考虑的物品是 { I 2 , . . . , I n } \{ I_2, ... , I_n\} {I2​,...,In​},即包括了 I 2 I_2 I2​,因此它们都要决定 C [ 2 ] C[2] C[2]的值。但是与原问题一样,它们也要各自导出两个子问题,然后根据对各自的两个子问题的解来决定 C [ 2 ] C[2] C[2]的值。

现在已经出现4个子问题了。照这样下去,n个物品会导致 O ( 2 n ) O(2^n) O(2n)个子问题的产生。哪怕每个子问题都只对一个物品做出选择与否的决定,因此只需要 O ( 1 ) O(1) O(1)的时间,但是总体上的时间复杂度仍然达到了 O ( 2 n ) O(2^n) O(2n)。

那该怎么办?这时就体现出动态规划的独特性了。动态规划并不会自顶向下递归,而是会从解决子问题 W = 1 , { I n } W=1,\{I_n\} W=1,{In​}开始,然后是 W = 1 , { I n − 1 , I n } W=1,\{I_{n-1},I_n\} W=1,{In−1​,In​},依次到 W = 1 , { I 1 , . . . , I n − 1 , I n } W=1,\{I_1,...,I_{n-1},I_n\} W=1,{I1​,...,In−1​,In​}。并且每当解决一个子问题,就将它的解记录在一个表里(这是动态规划的必备),可以将这个表称为子问题表。到这一步, W = 1 W=1 W=1时的所有物品已经考虑过了,所以我们将 W W W增加为2,然后从 W = 2 , { I n } W=2,\{I_n\} W=2,{In​}开始,重复上述过程。当然,我这里并非对求解过程的详细描述,而只是一个概述。具体实现需要对边界情况稍加处理,甚至可以以一种不同的方式自底向上。但无论如何,它们肯定都是自底向上。

子问题复用

但是,为什么自底向上?它比自顶向下递归有何优势?当然有,这种求解方法让时间复杂度从 O ( 2 n ) O(2^n) O(2n)降到了 O ( W n ) O(Wn) O(Wn)。这是因为在计算子问题表时,每个表项只需要 O ( 1 ) O(1) O(1)的时间,而既然有 O ( W n ) O(Wn) O(Wn)个表项,那么时间复杂度显然就是 O ( W n ) O(Wn) O(Wn)。

上述论证只适用于背包问题,但是从中可以提取一些见解。你发现没有,实际上真正的子问题只有 O ( W n ) O(Wn) O(Wn)这么多,即每个表项对应一个,那么自顶向下的 O ( 2 n ) O(2^n) O(2n)时间复杂度意味着什么?意味着它在递归的过程中肯定会反复遇到同一个子问题。由于 O ( 2 n ) O(2^n) O(2n)与 O ( W n ) O(Wn) O(Wn)的差异是如此之大,这种反复出现的子问题一定不在少数。相比于每次遇到它们时都将其从头求解一遍,还不如在第一次遇到它们后就将其解保存在一个表里,以后再遇到时就只需要查一下表;而这正是动态规划所做的。

子问题独立

现在立即就要说明一个微妙的地方:虽然重复出现的子问题正是动态规划提高效率的关键,但注意每个子问题必须是相互独立的。这可能容易令人混淆,但其实很简单。考虑两个子问题 P 1 P_{1} P1​和 P 2 P_{2} P2​,说它们会反复出现是指将给定问题分解所得的问题中,它们会反复出现;而说它们必须相互独立是指, P 1 P_{1} P1​的解应当与 P 2 P_{2} P2​的解无关。前者说的是两个子问题的事,后者说的是它们的解的事。至于为什么要提这个要求,我暂时顾不上展开了,你可以去看文献[1]的341-344页。

参考文献

[1] Cormen T H, Leiserson C E, Rivest R L, et al. 算法导论[M]. 2版. 北京:高等教育出版社,2002.

Haar-like特征提取原理_python基于haar-like特征的人脸检测 Kh=hIhwinKhhIhwin其中wIwIw_{I}和hIhIh_{I}是整个图像的宽高,wwinwwinw_{win}和hwinhwinh_{win}是haar窗口的初始宽高,可以放大的倍数为Kw⋅KhKw⋅KhHaar-like特征提取过程就是利用上面定义的窗口在图像中滑动,滑动到一个位置的时候,将窗口覆盖住的区域中的白色位置对应的像素值的和减去黑色位置对应的像素值的和,得到的一个数值就是haar特征中一个维度。 阅读详情

相关推荐

LD14激光雷达与STM32F103C8T6(标准库)获取雷达360度数据(1)

LD14激光雷达与STM32F103C8T6(标准库)获取雷达360度数据(1)

qq_54206194的博客 3897

动态规划入门——问题可用动态规划的特征

我一开始就有这样的疑惑,但是结合前面的“重叠子问题”特性,我们就易知为什么动态规划中的子问题具有无后效性,如果该子问题的解不仅与对应输入相关,还会受到其他子问题的解的影响,那么“重叠子问题”中将重叠子问题的解存放起来而避免冗余计算的设想就不能成立了,因为最开始的我们求解全局问题就是因为全局问题有着能够划分为独立子问题的性质,且能通过状态转移方程来描述问题之间的递推关系,如果所有子问题都是互相牵扯,恐怕也不能称之为子问题了。状态转移方程描述了问题之间的依赖关系,通过计算状态转移方程,可以求解出最终的问题。

qq_62412277的博客 165

ADS1220 STM32硬件SPI驱动程序

前一段时间温故了下标准库,使用的是F1系列芯片,测试程序。

随风飘零翼的博客 5766

三角矩阵的逆矩阵怎么求_矩阵特征分解求动态规划的终极解法

本文使用矩阵特征分解的方法来计算动态规划的通项公式,如果对线性代数这一块不太熟悉的,墙裂推荐下列视频基变换​www.bilibili.com特征值与特征向量​www.bilibili.com然后是动态规划的状态转移方程,可以参考永远在你身后:动态规划求解“组合总和”问题​zhuanlan.zhihu.com进入正题,考虑形如下形式的状态转移方程:可以构造出它的状态转移矩阵: 令 一般,可以用快速幂...

weixin_39875419的博客 2664

张量分解浅谈(四 Tucker 分解)

学完了SVD算法之后,我们继续回到张量几大分解的学习上来,本期学习的主要内容是张量的 Tucker 分解 以及 前面的CP分解还留下一点没有说完,正好一并补齐!后面的公式我将采用颜色标记,红色代表必须掌握,蓝色尽量掌握! 在这之前先附一张图,包含了各种运算符号的名称含义,大部分是前面说过或者使用过的: Tensor decomposition一 . Tucker 分解公式介绍和原理二 . 张量的 n-Rank 一 . Tucker 分解公式介绍和原理 我们先来看一张被使用过很多次的Trucker 分解图

欢迎来到 豪哥 的博客 1万+

手把手教你用C#实现TwinCAT 3 ADS通讯(附完整代码示例)

本文详细解析了如何使用C#实现TwinCAT 3 ADS通讯,包括协议核心价值、开发环境配置、变量通信实践及高级应用场景。通过完整代码示例和性能优化技巧,帮助开发者高效实现工业自动化系统中的实时数据交换,特别适合倍福(Beckhoff)平台用户。

weixin_29230901的博客 117

动态规划特征与解题通用步骤

明确dp数组的含义,确定状态表示。

only_foryou的博客 155

Scratch 3.0角色控制避坑指南:为什么你的键盘移动总卡顿?

本文深入剖析了Scratch 3.0中角色移动卡顿的根本原因,指出依赖`当按下`事件积木的局限性。通过对比分析,推荐采用`重复执行`结合`如果<键被按下?>`的循环控制方案,并引入速度变量模拟惯性,从而实现流畅、实时的键盘控制优化,显著提升游戏操作体验。

dd012的博客 1012

动态规划——问题特征与步骤精解

动态规划是一种高效的算法思想,在计算机科学和优化问题领域得到了广泛的应用。其核心在于解决具有最优子结构和重叠子问题的问题。最优子结构意味着一个问题的最优解可以通过其子问题的最优解递归构建,这使得问题可以被逐步分解为较小的子问题来求解。而重叠子问题的特性使得相同的子问题在递归过程中可能会被多次求解,因此动态规划通过保存子问题的解来避免重复计算,大大提高了算法的效率。动态规划通常通过构建一个递推关系式(状态转移方程)来求解问题,自底向上地逐步计算每个子问题的最优解,并最终获得整体问题的解。

QBoson的博客 684

飞牛fnNAS同步微信微信聊天记录

微信聊天记录如何备份到NAS?本文介绍了利用NAS虚拟机和同步工具实现微信记录自动备份的方法。通过在NAS上搭建"云电脑"长期运行微信PC端,并配置微力同步将聊天记录文件夹自动同步到NAS存储,解决了传统电脑备份的安全性问题。操作步骤包括:1)在NAS上安装虚拟机系统;2)登录微信PC端并同步手机记录;3)配置同步工具将微信记录文件夹同步到NAS。该方法尤其适合不常使用PC微信的用户,可实现记录永久保存和远程查看,更换手机时也能快速恢复历史记录。

dgnankai的专栏 4303

喷涂机器人系列编程:ABB IRB 5500_(7).喷涂质量控制与优化

通过编程手段对ABB IRB 5500喷涂机器人进行质量控制和优化,可以显著提高喷涂的均匀性和附着力,减少涂层缺陷。具体的方法包括喷涂参数的调整、路径规划的优化、喷涂效果的检测与反馈,以及喷涂参数的动态调整。综合评估系统可以进一步确保喷涂质量的稳定性和一致性,帮助汽车制造企业提高产品质量和生产效率。

zhubeibei168的博客 851

三、动态规划问题的特征

拉肚肚 4659

Happycapy深度解析:AI智能体的“iPhone时刻“来了?

从理论到实践深度解析了融合OpenClaw和ClaudeCode优点的超强智能体工具Happycapy

program哲学 457

Leetcode10.正则表达式匹配——动态规划之一个模型三个特征

文章目录引入“一个模型三个特征”理论Leetcode题解 引入 Leetcode中遇到了这样一道题: 10.正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 '’ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 在分析这道题的时候,很容易的就想到去挨个匹配,字符...

No_Game_No_Life_的博客 554

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

动态规划在深度学习中的应用:CNN 特征提取的层间 DP 剪枝

CNN 是深度学习中常用的模型,用于图像识别等任务,其核心是通过多个卷积层提取特征。每个层输出特征图(feature maps),通道数(channels)决定了特征的丰富度。然而,深层 CNN 往往存在冗余,导致计算量大、内存占用高。剪枝(pruning)技术通过移除不重要的权重或通道来压缩模型,但传统方法(如权重剪枝)可能忽略层间依赖关系。

2501_93897010的博客 1789

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

面试官:换人!他连动态规划的一个模型三个特征都不懂

前言之前我们简单总结了一下动态规划的解题套路,不少人反馈受益颇丰。不过有位读者说虽然动态规划的解题套路是看懂了,不过一些动态规划的主要特征,如无后效性没有提到,所以今天我们就简单以一道题...

weixin_43167418的博客 288

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

AI 辅助算法竞赛策略推荐:基于题目特征的动态规划路径

AI 辅助竞赛策略推荐通过"能力画像 → 缺口识别 → 路径规划 → 题目推荐"四阶段流水线,将随机刷题转变为系统性训练。核心价值在于识别知识缺口并规划递进式训练路径,使选手在有限时间内最大化能力提升。但推荐多样性、标签准确性、Rating 波动和组合题稀缺是需要权衡的关键因素。工程落地的务实策略是:6:3:1 比例分配训练重点,结合选手反馈修正推荐,控制训练负荷避免挫败感。

cannonjinx的博客 4742

动态规划:三大特征、四步骤、一道例题讲透

三个特征判断能不能用(最优子结构、无后效性是必要条件,重叠子问题决定效率优势)四个步骤告诉你怎么做(分析结构、写方程、填表、回溯)逆序顺序两种方向,本质等价,选顺手的把已经算过的答案存起来,用递推代替递归,用空间换时间。理解了这个,剩下的就是刷题练手感的事了。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 285

专业学习|动态规划(概念、模型特征、解题步骤及例题)

本文详细介绍了动态规划的基本构成、分类扩展、例题及解题步骤,通过本文可建立对动态规划的总体认识。

weixin_63253486的博客 2387

70. 爬楼梯 ----- 动态规划、滚动数组(技巧动态规划)、数学方法:特征方程、矩阵快速幂...

假设你正在爬楼梯。需要 n阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2输出:2解释:有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2: 输入:n = 3输出:3解释:有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶 提示: 1 <= ...

Mercury_cc的博客 79

双目立体视觉-特征匹配SGM算法-动态规划

学习SGM 算法时,在最小化能量方程时使用到了动态规划,现写下一些自己关于动态规划(Dynamic Programming,DP)的理解。 Action 前景: 在现实生活中,经常会遇到一种特殊的过程,多阶段决策。在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线.这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就...

远方传来风铃 740

数学模型:动态规划模型

动态规划基本思想:

2301_76800030的博客 177

通过以上特征可以看出,动态规划法的本质是**利用“重叠子问题”和“最优子结构”,通过存储子问题结果来减少计算量,从而高效求解复杂问题*

两种方法都利用了动态规划的核心思想:存储子问题的解以避免重复计算,相比朴素递归的O(2ⁿ)时间复杂度有了极大提升。在实际应用中,表格法通常效率更高,因为避免了递归调用的开销。

[Blog][Domain] programb.blog.youkuaiyun.com 882

动态规划题目特性

动态规划类的题目,大体来说,可以有几个极为明显的特征: 1、此类问题是一个由多决策产生最优值的最优化问题. 决策:是指在问题可以按时间顺序分成若干相互联系的阶段,每一个阶段都需要做出决策,产生最优值,整个求解过程中的决策是一个决策序列. 最优化问题:众所周知在信息学之中有四大类问题:判定性问题、构造性问题、计数问题和最优化问题。其中最优化问题遇到的较多,而最优化问题其实就是最后的答案需求一个

Hello,I'm Proking. 1675
下一篇: 幂等方阵可对角化
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值