【动态规划算法题记录】70. 爬楼梯——递归/动态规划
创作时间:
作者:
@小白创作中心
【动态规划算法题记录】70. 爬楼梯——递归/动态规划
引用
CSDN
1.
https://blog.csdn.net/weixin_43627638/article/details/139657405
本文详细讲解了LeetCode第70题“爬楼梯”的两种解法:递归和动态规划。通过清晰的分析和代码示例,帮助读者理解这两种算法的核心思想和实现细节。
题目描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬1 或 2个台阶。你有多少种不同的方法可以爬到楼顶呢?
题目分析
递归法(超出时间限制)
递归参数与返回值
void reversal(int i, int k)
每次我们处理第i个台阶到第k个台阶之间的可能性。这里我把结果int cnt
放在类成员中了,所以直接在函数中进行处理,不用返回。递归终止条件
当我们处理到最上面的台阶了,也就是reversal(n, n)
就可以结束当前递归。单层递归逻辑
单层递归中,我们再将区间(i, k)
细分下去:因为我们每次只能上一级或两级台阶,并且上了台阶之后才能处理更高层的范围,所以在缩小范围时,我们针对的是区间的左边。也就是:
for(int j = 1; j <= (k-i) && j <=2; j++){
reversal(i+j, k);
}
其中,j
就是我们上台阶的可能性,它的取值要小于等于2且不能超过区间的大小。
最终的cpp递归代码:
class Solution {
private:
int cnt;
public:
void reversal(int i, int k){ // 在第i个台阶到第k个台阶之间做决策
// 递归终止条件:已经到最上面的台阶,cnt加一并返回
if(i == k){
cnt++;
return;
}
// 单层递归:从第i个台阶到第k个台阶的可能性
// j在这里代表是上几个台阶
for(int j = 1; j <= (k-i) && j <=2; j++){
reversal(i+j, k);
}
}
int climbStairs(int n) {
cnt = 0;
reversal(0, n);
return cnt;
}
};
动态规划
确定dp数组以及下标的含义
dp[i]
:爬到第i
级台阶的方法数量。确定递推公式
dp[i] = dp[i-1] + dp[i-2]
因为我们只有两种上楼梯的方法,也即上一级台阶或两级台阶。试想:
- 我们上到第
i-1
级台阶时,共有d[i-1]
种方法,再上一级则到达第i
级台阶; - 我们上到第
i-2
级台阶时,共有d[i-2]
种方法,再上两级则到达第i
级台阶;
上到第i
级台阶也就两种情况,从第i-1
级台阶再上一级,或是从第i-2
级台阶再上两级,那么我们上到第i
级台阶的方法不就是dp[i-1] + dp[i-2]
。这也说明了每一级台阶的状态是由前面两级台阶决定的。
dp数组初始化
dp[1] = 1;dp[2] = 2;
因为第0级台阶不存在,所以我们不必纠结dp[0]
的值到底如何初始化。确定遍历顺序
因为dp[i]
是由它的前两个数决定,所以我们只能从前往后去遍历。举例推导dp数组
例如当n=5
:dp[1]=1;dp[2]=2;dp[3] = dp[2] + dp[1] = 3;dp[4] = dp[3] + dp[2] = 5;dp[5] = dp[4] + dp[3] = 8;
动态规划的cpp代码:
class Solution {
public:
int climbStairs(int n) {
if(n < 3) return n;
// 确定dp数组以及下标含义
vector<int> dp(n+1); //dp[i]是到达第i阶楼梯的方法总数
// 初始化
dp[1] = 1;
dp[2] = 2;
// 推导
for(int i = 3; i <= n; i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
};
热门推荐
西瓜子:减肥零食的双刃剑
傈僳族澡塘会&藏族沐浴节:云南温泉文化的独特魅力
云南6天5晚经典游:昆明-石林-大理-洱海-玉龙雪山-丽江古城
福州地铁防疫指南:这些防护要点请收好!
搭乘地铁4号线,探寻福州历史文化宝藏
秋日邂逅三坊七巷:地铁1号线上的诗意之旅
春节假期寄情于山水,除了“山水”还能玩什么?
社区禁放烟花:安全与传统的平衡之道
东山壹号小区火灾悲剧:谁该为72岁老人的离世负责?
万星物业提醒:春节别在楼道放烟花!
趵突泉景点的主要特色是什么?以下这6点,可帮你更好地了解
背靠历史 面向未来,百年上新街该如何重现繁华?
年夜饭必备:油焖大虾 vs 蒜蓉粉丝虾,谁更出圈?
简小厨教你做正宗山东油焖大虾!
油焖大虾的营养密码:Omega-3脂肪酸的多重健康益处
15岁孩子身高评估标准:专家建议与实用指南
南瓜子新吃法:从零食到沙拉的创意之旅
南瓜子与马铃薯的创意甜点:营养价值与制作灵感
春晚最经典小品排名,快来看看!最能吸引你的是哪个了?
在家轻松做出正宗上海小笼包,你敢挑战吗?
儿媳收公公饭钱引热议:如何避免家庭聚餐矛盾?
上海必打卡:生煎馒头&蟹粉小笼
国庆打卡上海必吃:城隍庙&云南南路小吃街
《特警力量》中的狙击枪与直升机:特警训练大揭秘!
喝黑咖啡的危害和副作用
神仙居最美打卡点揭秘:如意桥、观音峰、莲花台
春天打卡神仙居:李白同款仙境游
云梦:简牍之乡的文化宝藏
太平湖的绿色守护:黄山市的生态建设样本
探秘天下太平城:五行八卦的文化瑰宝