每日一题:动态规划

news/2025/3/19 5:16:52/

如题(基础题):

经典的爬楼梯问题,先从递归想起;

class Solution {
public:int climbStairs(int n) {if(n==1)return 1;if(n==2)return 2;return climbStairs(n-1)+climbStairs(n-2);}
};

之后可以想办法(如哈希表)去降低时间复杂度,即记忆化搜索或递归树的剪枝,避免对已经计算过的结点再次计算;

class Solution {
public:int climbStairs(int n) {int* memo=new int[n+1];return climbStairsMemo(n,memo);}int climbStairsMemo(int n,int memo[]){if(memo[n]>0){return memo[n];}if(n==1)memo[n]=1;else if(n==2)memo[n]=2;else{memo[n]=climbStairsMemo(n-1,memo)+climbStairsMemo(n-2,memo);}return memo[n];}};

既然都有递归了,那肯定有非递归的解法(比如从n=1或n=2进行逆运算);

class Solution {
public:int climbStairs(int n) {if(n==1){return 1;}int* dp=new int[n+1];dp[1]=1;dp[2]=2;for(int i=3;i<=n;i++){dp[i]=dp[i-1]+dp[i-2];}return dp[n];}
};

扩展:斐波那契数列;

同上:

斐波那契数列的每一项是前两项之和,通常从 0 和 1 开始。用数学公式表示为:

F(n)=F(n−1)+F(n−2)

扩展:

递归:

class Solution {
public:int dfs(int n,vector<int>& cost){if(n<=1){return 0;}return min(dfs(n-1,cost)+cost[n-1],dfs(n-2,cost)+cost[n-2]);}int minCostClimbingStairs(vector<int>& cost) {int n=cost.size();return dfs(n,cost);}
};//一般都超时

剪枝:

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n=cost.size();vector<int> memo(n+1,-1);function<int(int)> dfs=[&](int i)->int{if(memo[n]!=-1){return memo[n];}if(n<=1){return 0;}return memo[n]=min(dfs(n-1)+cost[n-1],dfs(n-2)+cost[n-2]);};return dfs(n);}
};

递推:

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n=cost.size();vector<int> dp(n+1);if(n<=1){dp[n]=0;}for(int i=2;i<=n;i++){dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);}return dp[n];}
};


http://www.ppmy.cn/news/1580239.html

相关文章

SpringBoot-已添加并下载的依赖,reload和mvn clean 后还是提示找不到jar包问题

背景&#xff1a; 添加spring-jdbc依赖时&#xff0c;原来是指定版本的&#xff0c;担心版本冲突&#xff0c;就改成依赖托管&#xff0c;悲剧的是反复reload和mvn clean&#xff0c;import到类的该包一直标红&#xff0c;提示jar包找不到。。。 解决方案&#xff1a; Idea左上…

2025-3-17 腾讯云-大数据方向-成都面试

ConcurrentHashMap了解过吗 适用场景 高并发环境&#xff0c;多个线程同时读写&#xff08;如缓存、计数器&#xff09;。需要 HashMap 的功能&#xff0c;但又要保证线程安全。适合读多写少的场景&#xff08;因为写操作需要 CAS 或锁&#xff09;。 volatile是什么&#xff…

游戏引擎学习第163天

我们可以在资源处理器中使用库 因为我们的资源处理器并不是游戏的一部分&#xff0c;所以它可以使用库。我说过我不介意让它使用库&#xff0c;而我提到这个的原因是&#xff0c;今天我们确实有一个选择——可以使用库。 生成字体位图的两种方式&#xff1a;求助于 Windows 或…

谷歌手机LEA流程

谷歌手机LEA流程 连接管理首次连接手机回连 业务管理音乐业务通话业务 链路切换管理 本篇文章简单介绍了谷歌手机使用LE Audio连接TWS耳机中的实现细节&#xff0c;强调了持续广播机制、业务差异化处理、链路切换逻辑及加密安全性。核心目标是优化低功耗音频连接的稳定性和资源…

MATLAB中griddedInterpolant函数用法

目录 语法 说明 示例 一维插值 比较使用完整网格和网格向量的三维插值 使用默认网格进行插值 更精细的网格上的二维插值 一维外插 在同一网格上进行多组值插值 griddedInterpolant函数的功能是实现网格数据插值。 语法 F griddedInterpolant F griddedInterpolant…

《CircleCI:CircleCI:解锁软件开发持续集成(CI)和持续部署(CD)高效密码》:此文为AI自动生成

《CircleCI&#xff1a;CircleCI&#xff1a;解锁软件开发持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;高效密码》&#xff1a;此文为AI自动生成 一、CircleCI 初印象 在当今软件开发的快节奏赛道上&#xff0c;持续集成&#xff08;CI&#xff0…

点点-一款超级强大AI生活搜索助手

今天得空,给兄弟萌墙裂推荐一款AI软件 ----点点! 前言 前两天刷小某书在评论区看到这么一句话:“在吃喝玩乐以及一些特别琐碎的很多方面,如果小某书搜不到的话,那就可能真的搜不到了”。这句话相信各位兄弟都深有同感,当代年轻人在互联网的状态之一是把小某书当某度用,…

JVM的各种细节

(1)JVM 核心结构&#xff08;必须知道&#xff09; 类加载器 负责将.class()文件加载到内存中&#xff0c;供 JVM 使用。 方法区 存储类元数据&#xff08;类名、字段、方法&#xff09;、常量池、静态变量等。 JDK 8&#xff1a;由元空间&#xff08;Metaspace&#xff09;…