作者推荐
简介
动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
优势场景
适用场景
最优化原理:假设问题的最优解所包括的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。
无后效性:即某阶段状态一旦确定。就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响曾经的状态。仅仅与当前状态有关。
有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到(该性质并非动态规划适用的必要条件,可是假设没有这条性质。动态规划算法同其它算法相比就不具备优势)。
大致步骤
一,状态定义。 二,转移方程 。 三,初始状态。 四,填表顺序。 五,返回值。
博文合集
字符串dp
C++动态规划算法的应用:得到 K 个半回文串的最少修改次数 原理源码测试用例
动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本
【动态规划】【滑动窗口】C++算法:3003 执行操作后的最大分割数量
【动态规划】【记忆化搜索】【C++算法】664. 奇怪的打印机
动态规划】【字符串】【C++算法】940. 不同的子序列 II
【动态规划】【逆向思考】【C++算法】960. 删列造序 III
数论组合数学dp
【动态规划】LeetCode2552:优化了6版的1324模式
【动态规划】LeetCode2111:使数组 K 递增的最少操作次数
【动态规划】C++算法:446等差数列划分 II - 子序列
【动态规划】【滑动窗口】【C++算法】 629K 个逆序对数组
【动态规划】【C++算法】801. 使序列递增的最小交换次数
矩阵
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
数位dp
【数位dp】【动态规划】C++算法:233.数字 1 的个数
图论dp、树形dp
【map】【动态规划】LeetCode2713:矩阵中严格递增的单元格数
【动态规划】【广度优先搜索】LeetCode:2617 网格图中最少访问的格子数
【动态规划】【 矩阵】【逆向思考】C++算法174地下城游戏
【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径
【动态规划】【map】【C++算法】1289. 下降路径最小和 II