当前位置: 首页 > news >正文

每日一题:动态规划

如题(基础题):

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

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];
    }
};

相关文章:

  • AI自动生成数据
  • idea 编译打包nacos2.0.3源码,生成可执行jar 包常见问题
  • 【算法】力扣 713题:乘积小于 K 的子数组之深入思考
  • E902基于bash与VCS的仿真环境建立
  • 1~2 课程简介+ESP32-IDF环境搭建、存储结构、启动流程(虚拟机Linux环境下)
  • 【C语言】:学生管理系统(多文件版)
  • Python使用总结之Flask构建文件服务器,通过网络地址访问本地文件
  • 蓝桥杯新手算法练习题单|冲击国一(三)
  • Java高频面试之集合-14
  • 【WEB APIs】正则表达式
  • AI小白的第六天:必要的数学知识(一)
  • 解决 Nginx 访问 /root/下 403 Forbidden 问题
  • 线程大乱斗:从入门到精通,解锁Java并发编程的终极秘籍
  • MTK Android12 应用在最顶端时,禁止拉起其他某个应用(一)
  • docker环境下安装flink
  • vector(沉淀)
  • 使用Azure CDN进行子域名接管
  • 解锁 DeepSeek 安全接入、稳定运行新路径
  • vulhub-joker攻略
  • VulnHub-Billu_b0x通关攻略
  • 习近平抵达莫斯科对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典
  • 诺和诺德一季度减重版司美格鲁肽收入增83%,美国市场竞争激烈下调全年业绩预期
  • 巴国家安全委员会授权军方自主决定对印反击措施
  • 詹丹|高考语文阅读题设计和答案拟制的一些缺憾
  • 潘功胜:央行将设立5000亿元服务消费与养老再贷款
  • 一周人物|何子彦任职光州双年展,陈意心讲述五原路往事