- 判断动态规划 - 同时满足以下条件
- 1.是数学优化对方法 - 最优子结构
- 一个问题的最优解,是由它对各个子问题的最优解决定的
- 状态转移方程 f(n)
- 2. 是编程的方法 - 重叠子问题
- 保证每个重叠的子问题,只会被求解一次
- 1.是数学优化对方法 - 最优子结构
- 解题思路
- 1. 找最优子结构:输入规模对半分
- 2. 找最优子结构:每次减一个
- 3. 找重叠子问题
- 解决动态规划问题对两个难点
- 1. 如何定义 f(n)
- 2. 如何通过 f(1),f(2),... f(n-1) 推导出 f(n),即 状态转移方程
- 求解方式
- 递归 - 解 状态转移方程式
- 缺点:耗费非常多的重复计算
- 记忆化 Memoization
- 避免重叠计算
- 将已经计算出来的结果保存起来,下次遇到时,直接返回,节省计算时间
- 自底向上 Bottom-Up
- 通过状态转移方程,从最小对问题规模入手
- 不断地增加问题规模,直到达到所要求的问题规模为止
- 使用 记忆化 避免重复计算
- 递归 - 解 状态转移方程式
- 编码实现对两个难点
- 1. 应当采用什么样的数据结构来保存什么样对计算结果
- 往往是在把问题规模缩小对过程中进行
- 不仅是为了避免重复的计算,也是推导状态转移方程的关键
- 2. 如何利用保存下来的计算结果推导出状态转移方程
- 1. 应当采用什么样的数据结构来保存什么样对计算结果
- 动态规划分类
- 1. 线性规划
- 子问题的规模以线性的方式分布
- 结果可以存储在一维线性数据结构里,如:一维数组、哈希表等
- 2. 区间规划
- 各个子问题的规模由不同的区间来定义
- 结果存储在二维数组里
- 一般用 dp[i][j] 代表从第 i 个位置到 第 j 个位置之间对最佳状态或结果
- 3. 约束规划
- 在上述一般解法的基础上,加入限制或约束条件
- 1. 线性规划
-
- 一个问题的最优解,是由它对各个子问题的最优解决定的
- 状态转移方程 f(n)
- 2. 是编程的方法 - 重叠子问题
- 保证每个重叠的子问题,只会被求解一次
数据结构与算法 - 06 动态规划
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.