day32动态规划 | lc509斐波那契数列 | lc70爬楼梯 | lc746最小花费爬楼梯

day32动态规划

动态规划基础

动态包含哪几类问题?

  1. 基础题
  2. 背包问题(面试必备)
  3. 打家劫舍
  4. 股票问题
  5. 子序列问题

解决动态规划要解决的问题

  1. dp数组的定义 下标的含义 以及如何初始化

整个数组表示什么意思 下标又是什么意思 怎么初始化

  1. 递归公式
  2. dp数组遍历顺序
  3. 打印dp数组

打印可以用在debug上面


lc509斐波那契数列

该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。 给定n 求f(n)

按照递归思想来求解

  1. 确定dp数组以及下标

dp[i] 表示第i个菲波那切数是dp[i]

比如dp[5]表示 第5个斐波那契数的值是dp[5]

  1. 确定递推公式

dp[i] = dp[i - 1] + dp[i - 2] 一个数是由前两个数相加得来的

  1. dp数组的初始化

1 1 2 得出

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

  1. 确定便利顺序

从前往后便利

  1. 打印dp数组

用于debug 看看和想象中的是否一样


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

lc70爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

举例假设

  1. 假设楼梯一共就一层 那就一次就上去了
  2. 假设一共2层

1+1 2 一共两种

  1. 有三层

1+1+1 2+1 1+2 一共三种 也就是一阶和二阶相加的结果

  1. 4层

4楼只能有2楼和3楼 所以是一共5种

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


  1. 确定dp和i 以及初始化

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

初始化 dp[1] = 1; dp[2] = 2;

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

}

lc746使用最小花费爬楼梯

数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。

每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。

请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。

比如cost = [10, 15, 20] 楼顶的下标就是3 长度加一

dp[i] 代表达到下标i的位置 所需要的花费

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


    }
}
posted @ 2024-12-02 16:16  小杭呀  阅读(27)  评论(0)    收藏  举报