动态规划
什么是动态规划
- 动态规划和分而治之一样,也是一种算法思想。
- 动态规划将一个问题分解成
互相重叠
的子问题,通过反复解决子问题来解决原来的问题。 - 动态规划是分解成
互相重叠
的子问题;分而治之是分解为相互独立
的子问题
使用场景(斐波那契数列)
- 定义子问题:F(n )= F(n-1) + F(n-2)
- 从2到n,反复执行上述公式
function fibonacci (n) {
if ( n <= 1 ) {return n};
return fibonacci(n - 1) + fibonacci(n - 2);
}
爬楼梯(leetcode - 70)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
思路(动态规划)
- 因为每次你可以爬 1 或 2 个台阶;所以爬n个台阶的方法数等于爬n-1方法数和爬n-2方法数之和
- 可以采用动态规划 即 F(n) = F(n-1) + F(n-2)
var climbStairs = function(n) {
let dp0 = 0, dp1= 0, res = 1;
for(let i=1;i<=n; i++) {
dp0 = dp1;
dp1 = res;
res = dp0 + dp1
}
return res;
};
时间复杂度:O(n)
空间复杂度:O(1)