算法设计与分析:(二)动态规划
目录
- 设计思想
- 使用动态规划的必要条件
- 适用动态规划算法解决的问题的特征:
- 优化原则:
- 动态规划的一般步骤
- 以背包问题为例
动态规划本质上为带备忘录的穷举算法。对动态规划问题,直接套框架即可:问题有什么「状态」,有什么「选择」,然后穷举。
设计思想
动态规划算法适用于组合优化问题,通过划分子问题的边界,从子问题开始逐层向上求解,通过子问题之间的依赖关系进行推导计算,最大限度减少重复工作,提高算法效率。但需要较大的存储空间来存储子问题计算的中间结果。
使用动态规划的必要条件
使用动态规划的问题,必须满足优化原则
适用动态规划算法解决的问题的特征:
(1) 求解的问题是多阶段决策(优化)问题
(2)求解的过程是多步判断,从小到大依次求解每个子问题,最后求解的子问题即为原始问题
(3)子问题目标函数最优值之间存在依赖关系
(4)子问题符合「最优子结构」,即:子问题间必须互相独立。优化原则:
一个最有决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最有决策序列
可以通俗理解为子问题间必须互相独立。
啥叫相互独立?你肯定不想看数学证明,我用一个直观的例子来讲解。
比如说,假设你考试,每门科目的成绩都是互相独立的。你的原问题是考出最高的总成绩,那么你的子问题就是要把语文考到最高,数学考到最高…… 为了每门课考到最高,你要把每门课相应的选择题分数拿到最高,填空题分数拿到最高…… 当然,最终就是你每门课都是满分,这就是最高的总成绩。
得到了正确的结果:最高的总成绩就是总分。因为这个过程符合最优子结构,“每门科目考到最高”这些子问题是互相独立,互不干扰的。
但是,如果加一个条件:你的语文成绩和数学成绩会互相制约,数学分数高,语文分数就会降低,反之亦然。这样的话,显然你能考到的最高总成绩就达不到总分了,按刚才那个思路就会得到错误的结果。因为子问题并不独立,语文数学成绩无法同时最优,所以最优子结构被破坏。
动态规划的一般步骤
明确「状态」 -> 定义 dp 数组/函数的含义 -> 明确「选择」-> 明确 base case。
首先要写出所求解的组合优化问题的目标函数和约束条件
确定子问题的结构和边界,将问题转化为多步判断的过程
确定问题是否满足优化原则
找出子问题之间的依赖关系(优化函数)
找状态转移需要归纳思维,说白了就是如何从已知的结果推出未知的部分,如假设已知dp[i-1] 如何推出dp[i]注意子问题的重叠程度,如果子问题重叠度较低,使用动态规划算法在时间复杂度上不会有较大改进
从初值开始自底向上计算子问题的优化函数值
以背包问题为例
问题描述:有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,每件物品数量只有一个,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?
写出所求解的组合优化问题的目标函数和约束条件
设xi = 0|1
,当xi=0
表示第i
件物品不放入背包,1则表示放入
设vi
代表第i
件物品的价值,wi
代表第i
件物品的重量
原问题即为求一个xi
序列,使得总价V
最大且总量W<10
目标函数为:
max(∑xi∗vi)max(\sum xi*vi)max(∑xi∗vi)
约束条件为:
∑xi∗wi<=10\sum xi*wi <=10∑xi∗wi<=10确定子问题的结构和边界,将问题转化为多步判断的过程
把原问题改为:当只能选择前i
件物品,背包容量为j
时,背包的最大价值,用dp[i][j]
表示。确定问题是否满足优化原则
背包问题满足优化原则,证明过程省略…找出子问题之间的依赖关系(优化函数)
关系为:dp[i][j] = max(dp[i-1][j],dp[i-1][j-wi]+vi)
说明:
dp[i][j]
:当只能选择前i
件物品,且背包容量为j
时,背包的最大价值。
max(dp[i-1][j],dp[i-1][j-wi]+vi)
中dp[i-1][j]
表示不放入第i
件物品,dp[i-1][j-wi]+vi
表示为放入第i
件物品,腾出wi
的重量后获得的价值从初值开始自底向上计算子问题的优化函数值
最后计算的子问题的解即为原始问题的解
算法设计与分析:(二)动态规划相关推荐
- 算法设计与分析:动态规划(3)-序列联配问题(以算代存)
文章目录 前言 高级动态规划 应用分治思想减少空间 计算得分 从后缀匹配到前缀匹配 伪代码 分治点计算改进 总结 本文参考UCAS卜东波老师算法设计与分析课程撰写 前言 本文内容承接上一次算法设计与分 ...
- 算法设计与分析——二项堆
引入 上一篇博课-二叉堆介绍了如何使用具有微弱限制的二叉树--要求父节点上的元素同时大于等于子节点或同时小于等于子节点--这种数据结构来实现一个优先队列,我们看到基于二叉堆实现的优先队列的各个基本操作 ...
- 【算法设计与分析】动态规划:最优二叉搜索树
最优二叉搜索树问题的问题提出是,设S={x1, x2, -, xn}是一个由n个关键字组成的线性有序集,(a0, b1, a1, -, bn, an) 为集合S的存取概率分布,表示有序集S的二叉搜索树 ...
- 计算机算法设计与分析二--分治
1.如果问题和以下数据结构相关,那么把他们分成子问题相对容易 n维数组 矩阵 n个元素的集合 树 有向无环图 通用图 2.分治算法一般应用于可以分成子问题的问题 实例: 一.排序问题:对一个n维数组排 ...
- 算法设计与分析实验---动态规划
1.石子合并 任务描述 沿着河岸摆放 N 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的 2 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 例如:4堆石子4,5,9,4,可 ...
- 【算法设计与分析】经典常考三十三道例题AC代码
❥小虾目前大三,我校在大一下开设<数据结构>这门课,大二上开了<算法设计与分析>这门课,很庆幸这两门课的上机考试总成绩一门100,一门99,最后总分也都90+.下文会给出机试的 ...
- 算法设计与分析:贪心算法 - 排课问题(DP与贪心的区别与应用)
文章目录 前言 贪心算法概念 排课问题 问题描述与分析 动态规划求解 简化问题应用贪心算法 总结 本文参考UCAS卜东波老师算法设计与分析课程撰写 前言 前面两大章节的内容分治思想与动态规划暂时告一段 ...
- 算法设计与分析——动态规划(二):钢条切割
分类目录:<算法设计与分析>总目录 相关文章: · 动态规划(一):基础知识 · 动态规划(二):钢条切割 · 动态规划(三):矩阵链乘法 · 动态规划(四):动态规划详解 · 动态规划( ...
- 算法设计与分析-----动态规划
算法设计与分析-----动态规划(c语言) 一.动态规划 1.定义 2.动态规划问题的解法 3.动态规划求解的基本步骤 4.动态规划与其他方法的比较 5.求解整数拆分问题 6.求解最大连续子序列和问题 ...
- 算法设计与分析——动态规划(五):最长公共子序列
分类目录:<算法设计与分析>总目录 相关文章: · 动态规划(一):基础知识 · 动态规划(二):钢条切割 · 动态规划(三):矩阵链乘法 · 动态规划(四):动态规划详解 · 动态规划( ...
最新文章
- Mvn+Jetty启动项目
- 初识Mysql(part5)--我需要知道的11条Mysql语句之过滤
- 如何在iPhone上共享视频之前从视频中删除音频
- 数组超过预设的最大数组大小_工作表数组大小的扩展及意义
- power bi图表_Power BI中的图表类型概述
- 数据可视化的十大优点
- 蓝桥杯真题:乘积尾零
- ping网络诊断常见故障
- Sopcast for linux更新至3.01!
- 邓亚萍加盟人民日报社 担任人民搜索一把手
- 什么是rip协议其优缺点_ospf和rip 优缺点
- gis怎么通过水库划分子流域_基于HEC-HMS模型推求西江流域巨型水库群区间入流...
- 多WLAN口路由器原理分析
- python简单网格五子棋_python实现简单五子棋游戏
- IDEA的mysql报错[08S01] 解决办法
- 你知道 DNS,那我猜你一定不知道 HTTPDNS
- B端产品客户画像的一点感悟
- 如何介绍自己测试过的项目
- Google Earth Engine——无人机影像进行分类处理
- google map 离线数据
热门文章
- Infinite Fraction Path UVALive - 8207
- 字符串hash(一)
- 【CF 1188 A1,B,C】Add on a Tree // Count Pairs // Array Beauty
- CF1444C-Team-Building【可撤销并查集】
- CF932G-Palindrome Partition【PAM】
- P6091-[模板]原根
- P3768-简单的数学题【莫比乌斯反演,杜教筛】
- POJ3764-The xor-longest Path【Trie(字典树)】
- 【2018.4.21】模拟赛之四-ssl2405 巧克力【实际上是模拟】
- 【jzoj】2018.2.7NOIP普及组——某【BC】组模拟赛