70.爬楼梯
动态规划
DP
斐波那契
动态规划介绍
动态规划(Dynamic Programming)是一种用于解决一类具有重叠子问题和最优子结构性质的问题的算法思想。它通过将一个问题分解成较小的子问题,并使用递归或迭代的方式求解这些子问题,最终得到原问题的解。动态规划通常用于优化问题,其中目标是找到一个最优解,使某个特定的目标函数最大或最小化。动态规划的核心思想是将大问题分解成小问题,并将小问题的解存储起来,以避免重复计算。这种存储和复用子问题解的方法称为“记忆化”或“缓存”,可以通过表格、数组或哈希表来实现。
动态规划的优点包括:
-
减少重复计算: 动态规划通过存储已经计算过的子问题的解,避免了重复计算,从而提高了效率。
-
简化问题: 动态规划将一个复杂的问题分解成一系列较小的子问题,使问题更加易于理解和解决。
-
提高效率: 动态规划通常可以将指数级别的时间复杂度降低到多项式级别,从而在一些复杂问题上提供了高效的解决方案。
-
适用范围广: 动态规划适用于各种不同类型的问题,包括最优化问题、组合问题、排列问题等。
题解说明
题目推断:
爬上第0层,有0个方法
爬上第1层,有1种方法(爬一次1个台阶)
爬上第2层,有2种方法(爬两次1个台阶; 爬一次2个台阶)
爬上第三层,就是爬上第二层有多少种,再加上向上爬一个台阶的种类 也就是 1+2 = 3
这样我们就总结出来了一个状态转移方程,定义res[n] = y,意思为,爬上第n层台阶有y种方式:
res[n] = res[n-1] = res[n-2]
代码
var climbStairs = function (n) {
//定义前集中
if (n == 1) return 1;
if (n == 2) return 2;
if (n == 3) return 3;
//创建一个数组
let res = [0];
res[1] = 1;
res[2] = 2;
//找到状态转移方程式
// res[3] = res[1] + res[2];
for (let i = 3; i <= n; i++) {
res[i] = res[i - 1] + res[i - 2];
}
return res[res.length - 1];
};