(十三)算法设计思想之“动态规划”

动态规划是什么?

动态规划是算法设计中的一种方法
它将一个问题分解为相互重叠的子问题,通过反复求解子问题,来解决原来的问题
(十三)算法设计思想之“动态规划”
(十三)算法设计思想之“动态规划”
最大区别在于子问题是否独立,子问题相互重叠是动态规划,子问题独立就是分而治之

动态规划的步骤

定义子问题
反复执行

LeetCode:70.爬楼梯

(十三)算法设计思想之“动态规划”
解题思路
爬到第n阶可以在第n-1阶爬1个台阶,或者在第n-2阶爬2个台阶
F(n) = F(n-1) + F(n-2)
使用动态规划
解题步骤
定义子问题:F(n) = F(n-1) + F(n-2)
反复执行:从2循环到n执行上述公式
(十三)算法设计思想之“动态规划”
时间复杂度O(n),空间复杂度O(n)
(十三)算法设计思想之“动态规划”
时间复杂度O(n),空间复杂度O(1)

LeetCode:198.打家劫舍

(十三)算法设计思想之“动态规划”
解题思路
f(k) = 从前k个房屋中能偷窃到的最大数额
Ak = 第k个房屋的钱数
f(k) = max(f(k-2) + Ak,f(k - 1))
考虑使用动态规划
解题步骤
定义子问题:f(k) = max(f(k-2) + Ak,f(k - 1))
反复执行:从2循环到n,执行上述公式
(十三)算法设计思想之“动态规划”
时间复杂度O(n),空间复杂度O(n)(十三)算法设计思想之“动态规划”
时间复杂度O(n),空间复杂度O(1)

思考题

1、说出动态规划算法的套路步骤。
2、完成打家劫舍2,地址:https://leetcode-cn.com/problems/house-robber-ii/