首页 > 编程语言 >代码随想录算法训练营第38天|● 理论基础 ● 509. 斐波那契数● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

代码随想录算法训练营第38天|● 理论基础 ● 509. 斐波那契数● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

时间:2024-06-17 20:30:04浏览次数:13  
标签:契数 遍历 爬楼梯 int 随想录 cost 数组 dp

动态规划理论基础

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。

所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的,


动态规划做题步骤

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

动态规划做题debug

  1. 找问题的最好方式就是把dp数组打印出来
  2. 做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果

斐波那契数

509. 斐波那契数 - 力扣(LeetCode)

本题为动态规划入门题,根据题目进行模拟即可

1.确定dp数组以及下标的含义

dp[i]的定义为:第i个数的斐波那契数值是dp[i]

2.确定递推公式

为什么这是一道非常简单的入门题目呢?

因为题目已经把递推公式直接给我们了:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];

3.dp数组如何初始化

题目中把如何初始化也直接给我们了,如下:

arr[0]=0;

arr[1]=1;

4.确定遍历顺序

从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的

class Solution {
    public int fib(int n) {
     if (n <= 1) {
            return n;
        }
        int[] arr = new int[2];
        arr[0] = 0;
        arr[1] = 1;

        for (int i = 2; i <= n; i++) {
            int sum = arr[0] + arr[1];
            arr[0] = arr[1];
            arr[1] = sum;
        }
        return arr[1];
    }
}

爬楼梯

70. 爬楼梯 - 力扣(LeetCode)

     1.确定dp数组(dp table)以及下标的含义

          到达第i 层有dp[i]种方法

      2.确定递推公式

           dp[i]=dp[i-1]+dp[i-2]

      3.dp数组如何初始化

           dp[1]=1;  

          dp[2]=1;

     4.确定遍历顺序

         从前向后遍历

代码:

class Solution {
    public int climbStairs(int n) {
        if(n<=2){
            return n;
        }
        int[] arr = new int[2];
        arr[0] = 1;
        arr[1] = 2;
        for (int i = 3; i <= n; i++) {
            int sum = arr[0] + arr[1];
            arr[0] = arr[1];
            arr[1] = sum;
        }
        return arr[1];
    }
}

使用最小花费爬楼梯 

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

1.确定dp数组以及下标的含义

    dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]。  

2.确定递推公式

      dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。

     dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。

    那么dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);

3.dp数组初始化

由题目可以知道你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。所以从0或1开始不需要花钱

dp[0]=0;dp[1]=0;

4.遍历顺序

从前向后

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int[] dp = new int[cost.length + 1];
        dp[0] = 0;
        dp[1] = 0;
        for (int i = 2; i <= cost.length; i++) {
            dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
        }
        return dp[cost.length];
    }
}

标签:契数,遍历,爬楼梯,int,随想录,cost,数组,dp
From: https://blog.csdn.net/weixin_74408291/article/details/139753086

相关文章

  • 代码随想录第10天 | 栈与队列part01
    题目:232.用栈实现队列思路:1.使用双栈,一个作为输入,一个作为输出代码:classMyQueue{private:stack<int>A,B;public:MyQueue(){}voidpush(intx){A.push(x);}intpop(){//删除A栈底元素并返回元素intresult=this->p......
  • 代码随想录第11天 | ●字符串总结 ●双指针回顾
    字符串总结字符串是若干字符组成的有限序列,也叫字符数组。C语言中,把字符存入数组,以结束符'\0'为结束标志,'\0'可作为判断依据c++中,提供string类,string类提供各种接口,其中size()可作为结束判断标志。vector<char>和string相差不大,string类提供处理字符串的接口更多字符串类......
  • 代码随想录算法训练营第15天 |
    代码随想录算法训练营第15天翻转二叉树https://leetcode.cn/problems/invert-binary-tree/description/翻转二叉树代码随想录https://programmercarl.com/0226.翻转二叉树.html对称二叉树题https://leetcode.cn/problems/symmetric-tree/对称二叉树代码随想录https://pro......
  • 代码随想录算法训练营第39天 | 62.不同路径 、63. 不同路径 II
    今天开始逐渐有dp的感觉了,前两题不同路径,可以好好研究一下,适合进阶详细布置62.不同路径本题大家掌握动态规划的方法就可以。数论方法有点非主流,很难想到。https://programmercarl.com/0062.不同路径.html视频讲解:https://www.bilibili.com/video/BV1ve4y1x7Eu/***@p......
  • 代码随想录算法训练营第36期 last day
    最后一次更新,之后去复习专业课和简历583两个字符串的删除操作自己做出来了:Code:class Solution {public://找到公共子序列的最大长度dp 最小步数=串1.size-dp+串2.size-dp    int minDistance(string word1, string word2) {        vector<vector<int......
  • 代码随想录刷题记录(7)| 字符串(344.反转字符串,541. 反转字符串II,卡码网:54.替换数字)
    目录(一)反转字符串1.题目描述2.思路3.解题过程(二)反转字符串Ⅱ1.题目描述2.思路3.解题过程(三)替换数字1.题目描述2.思路3.解题过程(一)反转字符串344.反转字符串-力扣(LeetCode)1.题目描述        编写一个函数,其作用是将输入的字符串反转过......
  • 代码随想录刷题记录(8)| 字符串(151.反转字符串里的单词,卡码网:55.右旋转字符串,28. 找出字
    目录(四)反转字符串里的单词1. 题目描述2.思路3.解题过程(1)使用额外空间存储(2)原地反转 (五)右旋转字符串1.题目描述2.思路3.解题过程 (六)找出字符串中第一个匹配项的下标1.题目描述2.思路3.解题思路(七)重复的子字符串1.题目描述2.思路3.解题过程(八)......
  • 代码随想录算法训练营第六十天 | 647. 回文子串、516.最长回文子序列
    647.回文子串文字讲解:代码随想录视频讲解:动态规划,字符串性质决定了DP数组的定义|LeetCode:647.回文子串_哔哩哔哩_bilibili解题思路1.dp[i][j]     [i,j]子串是否是回文的      是则返回true,不是则返回false2.递推公式if(s[i]==s[j])   ......
  • 代码随想录算法训练营第五十九天 | 115.不同的子序列、583. 两个字符串的删除操作、72
    115.不同的子序列题目链接:代码随想录视频讲解:动态规划之子序列,为了编辑距离做铺垫|LeetCode:115.不同的子序列_哔哩哔哩_bilibili解题思路1.dp[i][j]  为在s的前i个元素(即s[0,i-1])(以i-1结尾)中,有多少个t[0,j-1]匹配(以t[j -1]为结尾)2.递推公式//如果......
  • 代码随想录算法训练营第五十八天 | 392.判断子序列
    392.判断子序列 题目链接:代码随想录视频讲解:动态规划,用相似思路解决复杂问题|LeetCode:392.判断子序列_哔哩哔哩_bilibili解题思路本题和求最长公共子序列是一样的,值就是s字符串的长度,如果一致就返回true,如果不一致就是false这题也可以看作编辑距离入门级别的题目......