代码随想录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];
    }
}

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

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

你可能感兴趣的:(代码随想录,动态规划,算法)