leetcode:746. 使用最小花费爬楼梯

学习要点

  1. 动态规划正着推
  2. 动态规划倒着推
  3. 理解递归
  4. 在动态规划与纯递归的类比分析中体会两者各自的特点

题目链接

746. 使用最小花费爬楼梯 - 力扣(LeetCode)

题目描述

解法1:动态规划倒着推

cpp 复制代码
// dp[i]--->从第i阶楼梯到达楼顶最小花费
     int minCostClimbingStairs(vector<int>& cost) {
         // dp[i]--->从第i阶楼梯到达楼顶最小花费
         int n = cost.size();
         vector<int> dp(n);
         dp[n-1] = cost[n-1];
         dp[n-2] = cost[n-2];
         for(int i = n-3;i>=0;i--)
         {
             dp[i] = min(dp[i+1] , dp[i+2]) + cost[i];
         }
         return min(dp[0],dp[1]);
     }

解法2:动态规划正着推

cpp 复制代码
//dp[i]--->到达第i阶楼梯的最小花费
int minCostClimbingStairs(vector<int>& cost) {
    int n = cost.size();
    vector<int> dp(n + 1);
    dp[0] = 0;
    dp[1] = 0;
    for (int i = 2; i < (n + 1); i++)
    {
        dp[i] = min((dp[i - 1] + cost[i - 1]), (dp[i - 2] + cost[i - 2]));
    }
    return dp[n];
}

解法分析

  1. 两种解法都是采用动态规划思想去解决问题,也就是说采用动态规划方法去解决问题时,不止一种思考方式
  2. 动态规划法去解决问题时,宏观逻辑是,利用计算机的记忆,把每种情况都记住,然后一步步迭代,这次迭代的过程,依赖上次迭代的结果,上次迭代的结果被计算机存储了。
  3. 可以说动态规划是在一步步的暴力穷举,只有走了第一步,才能走好第二步。只有走了第二步,才能走好第三步
  4. 动态规划在记什么:在记状态,你决定如何考虑状态,就决定你要怎么走
  5. 最好怎么考虑状态:状态最少的状态,就是解决问题最好的状态

解法3:纯递归

cpp 复制代码
// 纯递归-->通过样例259/285,超出时间限制
     int dfs(int n,vector<int>& cost)
     {
         if(n == 0) return 0;
         if(n == 1) return 0;
         int num_1 = dfs(n-1,cost) + cost[n-1];
         int num_2 = dfs(n-2,cost) + cost[n-2];
         return min(num_1,num_2);
     }
     int minCostClimbingStairs(vector<int>& cost) {
         int n = cost.size();
         int m1 = dfs(n-1,cost) + cost[n-1];
         int m2 = dfs(n-2,cost) + cost[n-2];
         return min(m1,m2);
     }

动态规划与递归类比

  1. 两者都是从最小或者说最直接的问题开始进行处理,一步步处理问题,达到最终目的
  2. 动态规划的问题处理过程是指定迭代结构,时间复杂度为O(n)
  3. 递归的问题处理过程是递归树结构,有太多的重复计算,造成时间复杂度膨胀
  4. 递归往往因为时间复杂度太高,而无法处理大范围的动态规划问题以及其它大范围的问题
  5. 递归能处理的问题,动态规划未必能轻松处理。例如leetcode:21. 合并两个有序链表-CSDN博客如果使用动态规划,实在无从下手。
相关推荐
We་ct2 分钟前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
Lionel6897 分钟前
分步实现 Flutter 鸿蒙轮播图核心功能(搜索框 + 指示灯)
算法·图搜索算法
小妖66611 分钟前
js 实现快速排序算法
数据结构·算法·排序算法
xsyaaaan13 分钟前
代码随想录Day30动态规划:背包问题二维_背包问题一维_416分割等和子集
算法·动态规划
zheyutao1 小时前
字符串哈希
算法
A尘埃1 小时前
保险公司车险理赔欺诈检测(随机森林)
算法·随机森林·机器学习
网络安全-杰克2 小时前
2026面试自动化测试面试题【含答案】
自动化测试·软件测试·面试·职场和发展
大江东去浪淘尽千古风流人物2 小时前
【VLN】VLN(Vision-and-Language Navigation视觉语言导航)算法本质,范式难点及解决方向(1)
人工智能·python·算法
努力学算法的蒟蒻3 小时前
day79(2.7)——leetcode面试经典150
算法·leetcode·职场和发展
2401_841495643 小时前
【LeetCode刷题】二叉树的层序遍历
数据结构·python·算法·leetcode·二叉树··队列