当前位置: 首页 > news >正文

代码随想录DAY32|动态规划、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

1. 动态规划

动规五部曲

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

每次写动态规划题要考虑清楚这五步,特别是每一步为什么这么写,才算掌握了一道题。

2. 斐波那契数

力扣

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

还可以做空间优化

class Solution {
    public int fib(int n) {
        if (n < 2) return n;
        int a = 0, b = 1, c = 0;
        for (int i = 1; i < n; i++) {
            c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
}

递归写法

class Solution {
public:
    int fib(int N) {
        if (N < 2) return N;
        return fib(N - 1) + fib(N - 2);
    }
};

3. 爬楼梯

力扣

从到达第i层台阶有两种方法:从i-2走两步或者i-1走一步。令dp[i]表示走到第i层的所有方法,那么dp[i]就是dp[i - 1]和dp[i - 2]的总和。

class Solution {
    public int climbStairs(int n) {
        if(n <= 2) return n;
        //dp[i]:爬到第i层楼有几种解法
        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];
    }
}

dp[0]的初始化没有意义,因为题目说明了从1开始。为了代码的统一性也可以从0开始:

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

4. 使用最小花费爬楼梯

力扣

dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]。
可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]。
dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。
dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。
选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])。
题目中表述为:可以从0层或1层开始,证明可以初始化 dp[0] = 0,dp[1] = 0。

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

相关文章:

  • 大数据学习(48) - Flink状态种类
  • 【Spring+MyBatis】_图书管理系统(上篇)
  • Java并发编程面试题:内存模型(6题)
  • 中药细粒度图像分类
  • Vulkan 学习(14)---- 描述符集
  • 社群效应与开源AI智能名片2+1链动模式S2B2C商城小程序在流量变现中的应用探索
  • 什么是3D视觉无序抓取?
  • 153~173笔记
  • 基于SpringBoot的鲜花商城
  • 通用评估系统(五)- 前端部分总体说明
  • qt QOpenGLTexture详解
  • 算法【贪心经典题目专题4】
  • 用AI写SQL2——递归查询WITH RECURSIVE
  • 科技云报到:科技普惠潮流渐起,“开源”将带我们走向何方?
  • 北京海百川科技有限公司:以智能体技术助力特殊教育行业
  • Python中如何进行数据库连接?
  • [题解]2024CCPC重庆站-小 C 的神秘图形
  • 智能马达保护器:为工业电机安全运行保驾护航
  • HepG2细胞复苏实验以及六孔板种植细胞实验
  • JavaEE基础 Tomcat与Http (下)
  • 住房和城乡建设部办公厅主任李晓龙已任部总工程师
  • 中吉乌铁路重点控制性工程开工建设,包括三座隧道
  • 78家公募年度业绩比拼:23家营收净利双升,十强座次微调
  • 俄外长:俄将在不损害伙伴关系前提下发展对美关系
  • 铁路五一假期运输今日启动,预计发送旅客1.44亿人次
  • 论法的精神︱张玉敏:知识产权保护要为社会经济文化发展服务