首页 > 编程语言 >代码随想录算法训练营第三十二天| 509. 斐波那契数 、70. 爬楼梯、746. 使用最小花费爬楼梯 。c++转java

代码随想录算法训练营第三十二天| 509. 斐波那契数 、70. 爬楼梯、746. 使用最小花费爬楼梯 。c++转java

时间:2024-11-18 15:14:53浏览次数:3  
标签:契数 爬楼梯 int res 随想录 cost 数组 return dp

理论基础

总结一下就是:

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

动态规划五部曲

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

509. 斐波那契数

1.递归

class Solution {
    public int fib(int n) {
        if(n == 0 || n == 1)
            return n;
        return fib(n - 1) + fib(n - 2);
    }
}

2.dp

先按照动态规划的五部曲

1.确定dp数组以及下标的含义:dp数组表示的就是Fn,其中dp[i] = Fi.

2.确定递归公式:F(n) = F(n - 1) + F(n - 2).

3.dp数组的初始化:dp[0] = 0,dp[1] = 1.

4.确定遍历顺序:2~n.

5.举例推导dp数组:dp[2] = dp[1] + dp[0] = 1.

可以写出下面代码:

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

但是对于这道题,其实我们只需要用到最后的dp[n],所以代码可以改为:

class Solution {
    public int fib(int n) {
       if(n < 2)
           return n;
       int res = 0;
       int first = 0;
       int second = 1;
       for(int i = 2;i <= n ;i++){
            res = first + second;
            first = second;
            second = res;
       }
       return res;
    }
}

70. 爬楼梯

思路:可以跟上面一样用递归,或者dp做,dp分析如下:

1.dp数组表示的是从第一节台阶到第n个台阶的方式数,dp[i]表示的是从1~i有多少种走法。

2.递推公式:dp[i] = dp[i - 1] + dp[i - 2]。

3.dp数组的初始化:dp[1] = 1,dp[2] = 2;

4.遍历顺序:3~n

5.举例推导递推公式:dp[3] = dp[2] + dp[1];

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

746. 使用最小花费爬楼梯

思路:还是使用五部曲进行分析,但是这里特殊的一点就是,最后for循环里我们只算到了cost.length处,还没有到达顶部,可以在最后的时候比较一下,倒数第一步和倒数第二步,哪个更少,取一个min就是result了。

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

总结:五部曲确实很好用,可以分析得也更透彻(๑•̀ㅂ•́)و✧

标签:契数,爬楼梯,int,res,随想录,cost,数组,return,dp
From: https://blog.csdn.net/weixin_46002954/article/details/143814830

相关文章

  • 代码随想录算法训练营第三十三天| 62.不同路径 、63. 不同路径 II、343. 整数拆分 。c
    62.不同路径思路:按照dp五步法分析,成功AC。代码随想录classSolution{publicintuniquePaths(intm,intn){int[][]dp=newint[m+1][n+1];dp[0][1]=1;for(inti=1;i<=m;i++){for(intj=1;j<=n;j++){......
  • 代码随想录:螺旋矩阵 II
    代码随想录:螺旋矩阵II题目是不难的,本质是重复多次顺时针旋转,注意边界条件。我第一次写错是二维数组的运用出了问题,vec[i][j]中,i代表行,j代表列,我的脑袋是明白的,但是在运用时,一开始二维矩阵向右遍历时,其实变的是j而非i另外注意一下二维vector的建立就行//二维vector数组本质上......
  • 代码随想录:长度最小的子数组
    代码随想录:长度最小的子数组现在不像考研那时候,每天时间都是固定的,以后可能还是以周为单位定目标比较好一点滑动窗口问题,之后记得和计算机网络里的滑动窗口对比,并且和背包问题对比classSolution{public:intminSubArrayLen(inttarget,vector<int>&nums){i......
  • 代码随想录:开发商购买土地
    代码随想录:开发商购买土地纯铸币题目浪费时间,两个include记一下#include<climits>//INT_MAX#include<cmath>//min#include<iostream>#include<vector>#include<climits>#include<cmath>usingnamespacestd;intmain(){inta,b;cin>......
  • 数据结构与算法刷题(参考代码随想录结构,C、C++实现)
    目录数组数组理论基础二分查找移除元素有序数组的平方长度最小的子数组螺旋矩阵Ⅱ总结篇链表1.链表理论基础2.移除链表元素3.设计链表4.反转链表5.两两交换链表中的节点6.删除链表的倒数第N个节点7.链表相交8.环形链表Ⅱ9.总结篇哈希表1.哈希表理论基础2.有效的字母异位词3.两个数......
  • 代码随想录算法训练营第四十七天|Day47 单调栈
    739.每日温度https://programmercarl.com/0739.%E6%AF%8F%E6%97%A5%E6%B8%A9%E5%BA%A6.html思路int*dailyTemperatures(int*temperatures,inttemperaturesSize,int*returnSize){int*answer=(int*)malloc(temperaturesSize*sizeof(int));int*sta......
  • 代码随想录算法训练营第四十八天|Day48 单调栈
    42.接雨水https://programmercarl.com/0042.%E6%8E%A5%E9%9B%A8%E6%B0%B4.html思路inttrap(int*height,intheightSize){intans=0;intleft=0,right=heightSize-1;intleftMax=0,rightMax=0;......
  • 代码随想录算法训练营day47| 739. 每日温度 496.下一个更大元素 I 503.下一个
    学习资料:https://programmercarl.com/0739.每日温度.html#算法公开课单调栈:用数组模拟单调栈,今天的题中,栈中元素都保存的索引值基本思路:将新元素和栈顶索引对应值比较,如果要保持单调递增,则需要新元素不大于栈顶索引对应值;若满足就加入新元素索引到栈中;若不满足,就根据具体题意看......
  • 代码随想录算法训练营day46| 647. 回文子串 516.最长回文子序列
    学习资料:https://programmercarl.com/0647.回文子串.html#算法公开课动态规划最后一部分:回文字符串子串是从原字符串中连续截取的;子序列可以是从原字符串中不连续提取出元素构成的学习记录:647.回文子串(难构造dp数组,dp数组是从原字符串截取[i,j]范围的片段是否是回文字符串,布尔......
  • 代码随想录:有序数组的平方
    代码随想录:有序数组的平方仍然是双指针,一开始也想到了双指针,不过很笨的创造了两个数组,一个负数的一个正数的,两个数组比大小后插入。但其实可以直接把原数组平方后,从左右两边插入。有两点值得注意:1.已知数组大小的情况下,可以直接倒着插入数组。2.创建vector时需要指定元素的个数......