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

代码随想录打卡|Day28 动态规划(理论基础、斐波那契数列、爬楼梯、使用最小花费爬楼梯)

动态规划 Part01

理论基础

代码随想录讲解链接
视频讲解链接


斐波那契数

力扣题目链接
代码随想录链接
视频讲解链接

题目描述: 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
在这里插入图片描述

动态规划五部曲:

  1. dp[i]定义:dp[i]是第i个斐波那契数的值。
  2. 递推公式:dp[i] = dp[i-1] + dp[i-2];
  3. dp数组的初始化: dp[0] = 0;dp[1] = 1;
  4. 遍历顺序:从头到尾遍历
  5. 打印数组

代码如下:

class Solution {public int fib(int n) {// 定义dp数组int[] F = new int[n + 1];for(int i = 0 ; i < n + 1; i++){// dp数组的填充方式if(i == 0) F[i] = 0;else if(i == 1)F[i] = 1;elseF[i] = F[i - 1] + F[i - 2];}return F[n];}
}

爬楼梯

力扣题目链接
代码随想录链接
视频讲解链接

题目描述: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
在这里插入图片描述

动态规划五部曲:
1.dp[i]:当楼梯数为i的时候,从0到i的可行的爬楼方式。
2.递推公式:dp[i] = dp[i - 1] + dp[i-2];
3.dp数组初始化:dp[0] = 1;dp[1] = 2;
4.遍历顺序:从头到尾遍历
5.打印数组

代码如下:

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

使用最小花费爬楼梯

力扣题目链接
代码随想录链接
视频讲解链接

题目描述: 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。
在这里插入图片描述
动态规划五步:

  1. dp[i]:当登上第i层所需的最小消费
  2. 递推公式:我们在第i层的花费为dp[i]=min(dp[i - 1] + cost[i],dp[i - 2] + cost[i - 2]);
  3. 初始化:我们可以从下标0开始或者下标1开始,所以dp[0] = 0;dp[1] = 0;
  4. 遍历顺序
  5. 打印

代码如下:

站在当前楼层不收费(若楼层有i层,那么i+1层才是收费结果)
class Solution {public int minCostClimbingStairs(int[] cost) {int[] dp = new int[cost.length + 1];dp[0] = 0 ;dp[1] = 0;for(int i = 2 ; i <= cost.length ; i++){dp[i] = Math.min(dp[i - 1] + cost[i - 1] ,dp[i - 2] + cost[i -2]);}return dp[cost.length];}
}
站在当前楼层收费(第i层即收费结果)
// class Solution {
//     public int minCostClimbingStairs(int[] cost) {
//         int[] dp = new int[cost.length + 1];
//         dp[0] = 0 ;
//         dp[1] = 0;//         for(int i = 2 ; i <= cost.length ; i++){
//                 dp[i] = Math.min(dp[i - 1] + cost[i - 1] ,dp[i - 2] + cost[i -2]);
//         }
//         return dp[cost.length];
//     }
// }class Solution {public int minCostClimbingStairs(int[] cost) {int[] dp = new int[cost.length];dp[0] = cost[0];dp[1] = cost[1];for(int i = 2 ; i < cost.length ; i++){dp[i] = Math.min(dp[i - 1]  ,dp[i - 2]) + cost[i];}return Math.min(dp[cost.length - 1],dp[cost.length - 2]);}
}

状态压缩(用变量代替数组,减小空间复杂度)

// 状态压缩,使用三个变量来代替数组
class Solution {public int minCostClimbingStairs(int[] cost) {// 以下三个变量分别表示前两个台阶的最少费用、前一个的、当前的。int beforeTwoCost = 0, beforeOneCost = 0, currentCost = 0;// 前两个台阶不需要费用就能上到,因此从下标2开始;因为最后一个台阶需要跨越,所以需要遍历到cost.lengthfor (int i = 2; i <= cost.length; i ++) {// 此处遍历的是cost[i - 1],不会越界currentCost = Math.min(beforeOneCost + cost[i - 1], beforeTwoCost + cost[i - 2]);beforeTwoCost = beforeOneCost;beforeOneCost = currentCost;}return currentCost;}
}

http://www.xdnf.cn/news/160021.html

相关文章:

  • 深度学习-学习笔记
  • 网络原理 - 9
  • 硬件须知的基本问题2
  • Network.framework 的引入,不是为了取代 URLSession
  • 【锂电池剩余寿命预测】GRU门控循环单元锂电池剩余寿命预测(Matlab完整源码)
  • 静态多态和动态多态的区别
  • 大规模SoC芯片Hierarchical Flow Calibre LVS教程
  • 20250426在ubuntu20.04.2系统上打包NanoPi NEO开发板的FriendlyCore系统刷机eMMC的固件
  • CSS 定位学习笔记
  • springboot入门-业务逻辑核心service层
  • 上海交大:推理驱动的多模态提示重写
  • 20250426在ubuntu20.04.2系统上解决问题mkfs.exfat command not found
  • OpenStack Yoga版安装笔记(24)启动一个实例(L2Population测试)
  • 线程池(五):线程池使用场景问题
  • ROC 曲线 和 AUC
  • C/C++ 头文件包含机制:从语法到最佳实践
  • 利用知识图谱提升测试用例生成精准性:基于Graphiti与DeepSeek-R1的实战指南
  • git 工具
  • 神经网络与深度学习第四章-前馈神经网络
  • 在分类任务中,显著性分析
  • C++ 同步原语
  • 关于动态规划的思考[特殊字符]
  • [特殊字符] 深入理解Spring Cloud与微服务架构:全流程详解(含中间件分类与实战经验)
  • Day13(前缀和)——LeetCode2845.统计趣味子数组的数目
  • 计蒜客4月训练赛-普及 T3
  • 运维面试情景题:如果有一块新的硬盘要加入机架如何配置;如果新加了一台服务器,如何配置安全措施
  • 【开源】基于51单片机的简易智能楼道照明设计
  • C语言-函数练习1
  • arcpy列表函数的应用
  • 软件测评中心如何保障软件质量与安全性?