当前位置:首页 > 力扣 > 力扣70题:告别暴力递归!从零实现记忆化搜索解法

力扣70题:告别暴力递归!从零实现记忆化搜索解法

4个月前 (05-14)

力扣70题:告别暴力递归!从零实现记忆化搜索解法 递归 算法 力扣 动态规划 C++ 第1张

题意解析:

想象你站在楼梯底部,面前有n级台阶。每次你可以选择跨1级或2级台阶,最终到达顶端的路径有多少种不同的走法?这个问题本质上是在探索分叉决策的叠加效果——当我们把每个台阶处的选择看作二叉树的分支,最终需要计算所有直达终点路径的叶子节点总数。


思路解析:

从顶层台阶逆向思考:到达第n阶的最后一步,可能是从n-1阶跨1级而来,或是从n-2阶跨2级而来。递归基例设定n=0或n=1时仅有1种走法(平地不动或单步直上)。通过数组a缓存子问题解,将暴力递归的指数复杂度优化至线性复杂度。每次递归先查询缓存,未命中时计算结果并存入数组,避免重复计算。


代码解析:

class Solution {
public:
    int a[46]; // 记忆化数组,题目约束n<=45
    
    Solution() // 构造函数初始化数组
    {
        for(int i=0;i<45;i++)
        {
            a[i]=0; // 初始标记为未计算状态
        }
    }

    int climbStairs(int n) {
        if(n==0 || n==1) // 基例:平地也算一种路径,单台阶仅一种走法
        {
            return 1;
        }
        if(a[n]==0) // 尚未计算过当前台阶的解
        {
            // 关键递推式:当前解=前一级台阶解+前两级台阶解
            a[n]=climbStairs(n-1)+climbStairs(n-2);
        }
        return a[n]; // 返回已缓存的结果
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第71题:用栈轻松解决Unix路径简化问题

力扣第71题:用栈轻松解决Unix路径简化问题

题目解读:在Unix风格的文件系统中,我们经常需要处理各种复杂的路径表示。给定一个绝对路径字符串,我们需要将其转换为最简化的规范路径。规范路径要求:路径始终以斜杠'/'开头;两个目录名...

力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界

力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界

题目解读‌:在二叉搜索树的世界里,每个节点都默默记录着自己的数值。现在我们需要找出这些数值中出现频率最高的那些数字,也就是所谓的"众数"。有趣的是,二叉搜索树本身具有左小右大的特性...

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

一、题目解读2019年CSP-J的“纪念品”问题(对应洛谷P5662)要求玩家在T天内通过买卖纪念品最大化金币收益。每天可交易N种商品,需计算最优策略下的最终金币数。题目强调动态规划思维与资源分配优化...

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

一、题目解读LeetCode 120题“三角形最小路径和”要求给定一个由数字组成的三角形,从顶部开始向下移动,每次可向左或向右移动一格,计算从顶至底的最小路径和。三角形以二维向量形式给出,每层元素数量...

洛谷P4551题解题报告:图论与Trie树优化异或路径问题的实战解析

洛谷P4551题解题报告:图论与Trie树优化异或路径问题的实战解析

一、题目解读洛谷P4551题要求在一个无向图中,寻找任意两点路径权值异或后的最大值。题目输入为图的边信息(点数n和n-1条边),每条边包含起点、终点及权值。需输出所有路径中权值异或的最大值。问题核心在...

洛谷P4999题解析:动态规划求解数字拆分与求和问题(附代码)

洛谷P4999题解析:动态规划求解数字拆分与求和问题(附代码)

一、题目解读洛谷P4999题要求处理给定区间 [L, R] 内数字的拆分与求和问题。每个数字需拆分为其各位数字之和,并计算区间内所有数字之和的累加结果。题目需考虑大数情况,并采用取模运算(MOD=1e...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。