动态规划(dynamic programming, DP)是一种将复杂问题分解成更小的子问题来解决的优化技术。
用动态规划解决问题时,有三个步骤:
1)定义子问题;
2)实现要反复执行来解决子问题的部分
3)识别并求解出基线条件
能用动态规划解决的一些著名问题,如:背包问题,最长公共子序列,硬币找零等
拿leetcode 70爬楼梯举例:
假设你正在爬楼梯。需要n阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
**注意:**给定n是一个正整数。
爬到第n阶可以从第n - 1阶爬1个台阶,或者在第n - 2阶爬2个台阶
1)定义子问题 F(n) = F(n - 1) + F(n - 2)
- 反复执行子问题,从 2 循环到n ,执行上面的子问题(公式)
3)找到返回条件,临界条件
var climbStairs = function(n){
if(n < 2){ return 1; }
const dp = [1, 1];
for(let i = 2; i <= n; i +=1){
dp[i] = dp[i - 1] + dp[i - 2]
}
return dp[n]
}
参考:Javascript数据结构和算法、慕课网