哈哈,刚看了代码随想录卡哥的视频,忍不住想来练练手,所以这就作为第二篇文章吧。
废话不多说,还是看看题目,
假设你正在爬楼梯。需要
n
阶你才能到达楼顶。每次你可以爬
1
或2
个台阶。你有多少种不同的方法可以爬到楼顶呢?输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶
为什么这是一个动态规划的入门呢,要满足动态规划的条件,首先是不是得看它是否具有递推的关系在?一看,这个题目是不是和斐波那契数列非常相似?
对于n阶的楼梯,有几种方式爬上去呢?根据题目,可以从n-1阶爬1步,或者从n-2阶爬2步上去。而本题求的是一共有多少种方式,因此将其相加即可。
首先定义dp数组,dp[i]定义为,爬上第i阶楼梯的方式的数量。
状态转移方程由上述分析可得:dp[i] = dp[i-1] + dp[i-2]
那么怎么初始化dp数组呢?
通过状态转移方程可知,需要初始化的其实就是dp[0]和dp[1],不难想出,dp[0]=1,dp[1]=1(结合实际想一想,此处不多说了,重点在于dp[0],对于0阶,实际只有一种方法)
那么不难写出这个题的代码(献丑了,大佬们轻喷):
/**
* @param {number} n
* @return {number}
*/
var climbStairs = function(n) {
let dp = new Array(n+1);
dp[0] = 1;
dp[1] = 1;
for(let i = 2; i<=n ; i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
};