IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【力扣总结】LeetCode动态规划打卡day1(Java代码) -> 正文阅读

[数据结构与算法]【力扣总结】LeetCode动态规划打卡day1(Java代码)

跟着代码随想录刷的

1.理论基础

什么是动态规划

简称DPdp里的每一个状态一定是由上一个状态推导出来的

解题步骤

  • 确定dp数组及其下标的含义
  • 确定递推公式
  • dp数组进行初始化
  • 确定遍历顺序
  • 推导dp数组

如何debug

这道题目我举例推导状态转移公式了么?

我打印dp数组的日志了么?

打印出来了dp数组和我想的一样么?

2.fib数列

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

题意:

fib数列的含义为
f [ 0 ] = 0 , f [ 1 ] = 1 ; f [ i ] = f [ i ? 1 ] + f [ i ? 2 ] i > 1 f[0]=0,f[1]=1 ; f[i]=f[i-1]+f[i-2] i>1 f[0]=0,f[1]=1;f[i]=f[i?1]+f[i?2]i>1
给出n,求f[n]

思路:

  • 确定dp数组及其下标的含义:dp[i]表示第ifib的值
  • 确定递推公式:正如题意所说,递推公式为dp[i]=dp[i-1]+dp[i-2]
  • dp数组进行初始化:正如题意所说,dp[0]=0,dp[1]=1
  • 确定遍历顺序:只有一层遍历
  • 推导dp数组:答案就是dp[n]

代码:

class Solution {
    public int fib(int n) {
        if(n==0) return 0;
        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];
    }
}

3.爬楼梯

70. 爬楼梯 - 力扣(LeetCode)

题意:

每次可以爬12个台阶,问有多少种不同的方法可以爬到第n个台阶

思路:

  • 确定dp数组及其下标的含义:dp[i]表示爬到第i层的不同方法数量
  • 确定递推公式:因为每次都可以爬12个台阶,也就是说如果当前爬到了第i层,那么上一次有可能爬12个台阶,所以前一个状态为dp[i-1]dp[i-2]。因为统计的是不同方法的个数,所以递推公式为dp[i]=dp[i-1]+dp[i-2]
  • dp数组进行初始化:根据题意可知,dp[1]=1,dp[2]=2。其中后者的含义为想要爬到第2个台阶,可以先爬到第1个台阶再继续爬1个台阶,也可以直接爬2个台阶。dp[0]在本题里没有意义。
  • 确定遍历顺序:只有一层循环
  • 推导dp数组

代码:

时间复杂度和空间复杂度都是O(n)

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

拓展:

每次可以走[1,m]个台阶,问有多少种方法爬到第n个台阶?

相当于一个完全背包问题。

初始化为dp[0]=1,具体含义就是到达第0个台阶只有不走这一种方法。

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

4.使用最小花费爬楼梯

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

题意:

cost[i]表示从楼梯第i个台阶向上爬需要支付的费用,支付此费用后可以选择向上爬1-2个台阶。可以选择从下标为0/1的台阶开始爬楼梯。计算到达第n个台阶的最低花费。

思路1:

  • 确定dp数组及其下标的含义:dp[i]表示到达第i个台阶的最低花费(为了方便转移姑且认为第一步一定要花费,最后一步不用花费)
  • 确定递推公式:dp[i]=min(dp[i-1],dp[i-2])+cost[i],因为选的是最低花费,所以是对之前的两个状态取min。要加上cost[i]可以理解为支付了才能继续向上爬
  • dp数组进行初始化:dp[0]=cost[0],dp[1]=cost[1]
  • 确定遍历顺序:一层循环
  • 推导dp数组:返回结果是min(dp[n-1],dp[n-2]),因为实际上最后一步是没有花费的。

代码1:

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

思路2:

刚刚那种真的是太不好理解了。

  • 确定dp数组及其下标的含义:dp[i]表示到达第i个台阶的最低花费(这里我们认为第一步不需要花费)
  • 确定递推公式:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]),因为选的是最低花费,所以是对之前的两个状态取min。从i-1个台阶爬过来需要花费cost[i-1],所以要加上对应的cost数组值。
  • dp数组进行初始化:dp[0]=0,dp[1]=0,这里初始化为0表示默认第一步是不花费体力的。
  • 确定遍历顺序:一层循环
  • 推导dp数组:返回结果是dp[n]

代码2:

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int n=cost.length;
        int[] dp=new int[n+1];
        dp[0]=0;
        dp[1]=0;
        for(int i=2;i<=n;i++){
            dp[i]=Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
        return dp[n];
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:54:13  更:2022-05-18 17:56:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:23:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码