509. 斐波那契数
1、确定dp数组的含义
dp[i]代表第i个数的斐波那契数,dp是一个长度为n的数组,需要把每个数对应的斐波那契数存进去。
2、状态转移方程
F(n) = F(n - 1) + F(n - 2)
3、初始化dp数组
F(0) = 0,F(1) = 1
4、遍历顺序
dp[i]是依赖 dp[i - 1] 和 dp[i - 2],所以遍历顺序是从前往后
var fib = function(n) {
// 1、定义dp数组,数组是一个长为n的数组,用来存放0-n之间每个数的斐波那契数
let dp = new Array(n);
// 2、初始化
dp[0] = 0,dp[1] = 1;
// 3、开始从前往后遍历
for(let i=2;i<=n;i++){
// 状态转移方程
dp[i] = dp[i-1] + dp[i-2];
}
// 返回的是第n个数的结果
return dp[n];
};
70. 爬楼梯
其实就是最后的结果就是509.斐波那契数 ,只不过dp[0]的值不一样而已。
1、确定dp数组以及下标的含义
定义dp[i]为爬上第 i 级台阶有多少种方案。对于不同的n有不同的值。
2、确定状态转移方程
本问题其实常规解法可以分成多个子问题,爬第n阶楼梯的方法数量,等于 2 部分之和
爬上 n-1 阶楼梯的方法数量。因为再爬1阶就能到第n阶
爬上 n-2阶楼梯的方法数量,因为再爬2阶就能到第n阶
dp[i] = dp[i-1] + dp[i-2]。
3、初始化条件
i = 0 级开始爬的,所以从第 0 级爬到第 0 级我们可以看作只有一种方案,即 dp(0)=1;
i = 1 代表从第 0 级到第 1 级也只有一种方案,即爬一级,dp(1) = 1。
4、遍历顺序
从前往后进行遍历
5、返回值
n阶台阶有多少种方案,就是dp[n]
/**
* @param {number} n
* @return {number}
*/
var climbStairs = function(n) {
// 1、dp数组
const dp = new Array(n);
// 2、初始化状态
dp[0] = 1,dp[1] = 1;
// 3、从第二层开始遍历,因为只有到第二层台阶才有两种方案。
// 一直遍历,得到dp数组每个下标的值。
for(let i=2;i<=n;i++){
dp[i] = dp[i-1] + dp[i-2];
}
// 返回的是爬上第n个台阶的方案数
return dp[n];
};