笑看天下无敌手 发表于 2025-11-5 09:16:12

代码随想录算法训练营day32

代码随想录算法训练营

—day32


前言

本日是算法营的第32天,盼望自己可以或许对峙下来!
开始动态规划章节了,本日使命:
● 动态规划理论底子
● 509. 斐波那契数
● 70. 爬楼梯
● 746. 使用最小耗费爬楼梯
一、动态规划理论底子

   文章教学
视频教学
动态规划刷题大纲:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZjMyN2U1YzkxNjM4NDJlMGE5ZWQ2NzdjNDk5OWE3NjEucG5n
动态规划必要有一个推导公式,每一步都是由上一个状态推导出来的。
动态规划五步曲:

[*]确定dp数组以及下标的寄义
[*]确定递归公式
[*]dp数组怎样初始化
[*]确定遍历序次
[*]举例推导dp数组
做动规的标题,写代码之前肯定要把状态转移在dp数组的上具体情况模仿一遍,胸有定见,确定末了推出的是想要的效果。
二、509. 斐波那契数

   标题链接
文章教学
视频教学
思绪:

[*]dp的界说为:第i个数的斐波那契数值是dp
[*]递归公式:标题已经把递推公式直接给我们了:dp = dp + dp
[*]初始化:dp = 0, dp = 1
[*]遍历序次:由于递推公式是从前去后的,以是遍历序次是从前去后
动态规划

代码如下:
class Solution {
public:
    //动态规划
    //dp就是第i个斐波那契数
    //递推公式:dp = dp + dp;
    //初始化:dp = 0, dp = 1
    //遍历顺序:从头到尾
    int fib(int n) {
      if (n <= 1) return n;

      vector<int> dp(n+1);
      dp = 0;
      dp = 1;

      for(int i = 2; i <=n; i++) {
            dp = dp + dp;
      }

      return dp;
    }
};
动态规划优化空间版

由于效果只由前两项决定,以是不必要维护数组,只必要维护三个变量
代码如下:
class Solution {
public:
    //动态规划
    //dp就是第i个斐波那契数
    //递推公式:dp = dp + dp;
    //初始化:dp = 0, dp = 1
    //遍历顺序:从头到尾
    int fib(int n) {
      if (n <= 1) return n;

      //因为结果只由前两项决定,所以不需要维护数组,只需要维护三个变量
      int dp;
      dp = 0; //f
      dp = 1; //f

      for(int i = 2; i <=n; i++) {
            int sum = dp + dp; //f = f + f
            dp = dp; //更新f
            dp = sum; //更新f
      }

      return dp;
    }
};
递归法

这道题也可以用递归法,代码更加简便:
class Solution {
public:
    //递归法
    int fib(int n) {
      if (n < 2) return n;
      return fib(n - 1) + fib(n - 2);
    }
};
三、70. 爬楼梯

   标题链接
文章教学
视频教学
动态规划

思绪:

[*]dp的界说为: 爬到第i层楼梯,有dp种方法
[*]递归公式:由于dp都是由i-1走一层大概i-2走两层到达的,而dp就是走到i-1层的方法,dp就是走到i-2层的方法,那么走到i层就是dp + dp种方法。
dp = dp + dp;
[*]初始化:dp = 1,dp = 2,dp没有寄义,标题也说了n是大于0的,以是递推从1开始,初始化1,2,遍历从3开始。
[*]遍历序次:由于递推公式是从前去后的,以是遍历序次是从前去后
[*]举例推导dp数组:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMjhiMzk1MmJhYjE2NGZmOTgzYzllNzRkOGYzNTllODMucG5n
代码如下:
class Solution {
public:
    int climbStairs(int n) {
      if (n <= 2) return n;

      vector<int> dp(n + 1); //需要初始化大小
      dp = 1;
      dp = 2;

      for (int i = 3; i <= n; i++) {
            dp = dp + dp;
      }

      return dp;
    }
};
动态规划空间优化

这道题也是只跟i-1和i-2有关,以是只必要维护3个变量就可以了。
代码如下:
class Solution {
public:
    int climbStairs(int n) {
      if (n <= 2) return n;

      int dp; //优化空间
      dp = 1;
      dp = 2;

      for (int i = 3; i <= n; i++) {
            int sum = dp + dp;
            dp = dp;
            dp = sum;
      }

      return dp;
    }
};
746. 使用最小耗费爬楼梯

   标题链接
文章教学
视频教学
思绪:

[*]dp的界说为:代表走到第i台阶必要耗费多少
[*]递归公式:第i台阶通过第i-1台阶走一步大概第i-2台阶走两步到达,取两者耗费最小为最优解dp = min(dp + cost, dp + cost);
[*]初始化:默认第一步不耗费体力,第一步从下标0大概1开始, dp = 0, dp = 0
[*]遍历序次:由于递推公式是从前去后的,以是遍历序次是从前去后
代码如下:
class Solution {
public:
    //d含义:代表走到第i台阶需要花费多少
    //递推公式,第i台阶通过第i-1台阶走一步或者第i-2台阶走两步到达,取两者花费最小为最优解
    int minCostClimbingStairs(vector<int>& cost) {
      if (cost.size() < 2) return 0;

      vector<int> dp(cost.size() + 1);
      dp = 0; //默认第一步不花费体力
      dp = 0;

      for (int i = 2; i <= cost.size(); i++) {
            dp = min(dp + cost, dp + cost);
      }

      return dp;
    }
};
动态规划空间优化

同样可以优化空间:
class Solution {
public:
    //d含义:代表走到第i台阶需要花费多少
    //递推公式,第i台阶通过第i-1台阶走一步或者第i-2台阶走两步到达,取两者花费最小为最优解
    int minCostClimbingStairs(vector<int>& cost) {
      if (cost.size() < 2) return 0;

      int dp; //优化空间
      dp = 0; //默认第一步不花费体力
      dp = 0;

      for (int i = 2; i <= cost.size(); i++) {
            int sum = min(dp + cost, dp + cost);
            dp = dp;
            dp = sum;
      }

      return dp;
    }
};
总结

动态规划第一天!第一次打仗动态规划,牢记动态规划五步曲:

[*]确定dp数组以及下标的寄义
[*]确定递归公式
[*]dp数组怎样初始化
[*]确定遍历序次
[*]举例推导dp数组
一些小总结:

[*]想不明白的时间必要回归dp数组下标寄义再明白一下。
[*]初始化的时间假如遇到像是dp没有寄义的时间,试试从反面的dpdp比力明白初始化的下标开始初始化和递推。
[*]当递推公式只涉及i-1,i-2的时间,可以缩小数组巨细,只维护最小的数组来节流空间。
来日诰日继承加油!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 代码随想录算法训练营day32