• 代码随想录day38 || 动态规划理论基础 || 斐波那契数 || 爬楼梯 || 最小花费爬楼梯


    动态规划理论基础

    什么是动态规划

    ● DP 如果一个问题有若干个子问题,使用动态规划很有效
    ● 动态规划中每一个状态都是上一个状态推导出来的

    解题步骤

    ● 确定dp数组和下标含义
    ● 确定递推公式
    ● dp数组如何初始化
    ● 确定遍历顺序
    ● 举例推导

    debug

    ● 把dp数组打印出来,看看是不是自己推导的逻辑

    509. 斐波那契数

    ● 力扣题目链接
    ● 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你n ,请计算 F(n) 。

    思路

    ● dp数组含义:第i个数就是dp[i]
    ● 递推公式:dp[i] = dp[i - 1] + dp[i - 2]
    ● 初始化:dp[0] = 0, dp[1] = 1
    ● 从前往后
    ● 打印观察
    ● 时间复杂度:O(n)
    ● 空间复杂度:O(n)

    代码

    class Solution {
        public int fib(int n) {
            if (n <= 1) return n;
            int[] dp = new int[n + 1];
            dp[1] = 1;
            for (int i = 2; i <= n; i++) {
                dp[i] = dp[i - 1] + dp[i - 2];
            }
            return dp[n];
        }
    }
    // 优化,空间复杂度为O(1)
    class Solution {
        public int fib(int n) {
            if (n <= 1) return n;
            int[] dp = new int[2];
            dp[1] = 1;
            int sum = 0;
            for (int i = 2; i <= n; i++) {
                sum = dp[0] + dp[1];
                dp[0] = dp[1];
                dp[1] = sum;
            }
            return dp[1];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    70. 爬楼梯

    ● 力扣题目链接
    ● 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
    ● 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
    ● 注意:给定 n 是一个正整数。

    思路

    ● 其实和斐波那契数列很像
    ● 想要爬到第n阶,要么从n-1开始,要么从n-2开始
    ● 加和就行

    代码

    class Solution {
        public int climbStairs(int n) {
            if (n <= 1) return n;
            int[] dp = new int[2];
            dp[0] = 1;
            dp[1] = 1;
            int sum;
            for (int i = 2; i <= n; i++) {
                sum = dp[0] + dp[1];
                dp[0] = dp[1];
                dp[1] = sum;
            }
            return dp[1];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    746. 使用最小花费爬楼梯

    ● 力扣题目链接
    ● 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
    ● 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
    ● 请你计算并返回达到楼梯顶部的最低花费。

    思路

    ● 跳到第n阶,要么从n - 1,要么从n - 2,选加上cost最小的那个,遍历即可

    代码

    class Solution {
        public int minCostClimbingStairs(int[] cost) {
            int n = cost.length;
            int[] dp = new int[n + 1];
            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];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    【EasyRL学习笔记】第三章 表格型方法(Q-Table、Sarsa、Q-Learning)
    shiro550反序列化漏洞
    Spark中对大表子查询加limit为什么会报Broadcast超时错误
    【web-攻击访问控制】(5.2.1)攻击访问控制:不同用户账户进行测试、测试多阶段过程
    opencv 轮廓顶点重新排序----四边形
    vue动态数据在列表展示
    springboot基于微信小程序“智慧校园” 一体式的设计与实现毕业设计源码091634
    【docker/K8S】docker/K8S安装mysql的坑-20220815
    springboot整合mybatis入门程序
    Python装饰器通俗理解
  • 原文地址:https://blog.csdn.net/peach2580/article/details/132890948