蓝桥杯 Java B 组之简单动态规划(爬楼梯、斐波那契数列)
Day 6:简单动态规划(爬楼梯、斐波那契数列)
动态规划(Dynamic Programming,简称 DP)是计算机科学中的一种算法设计思想,用来解决最优解问题,它的核心思想是将大问题分解为小问题,并通过保存计算结果避免重复计算。常见的应用场景包括:最短路径、最优子结构、背包问题等。
今天,我们将详细学习两个经典的动态规划问题:
- 爬楼梯问题
- 斐波那契数列
一、动态规划概念
动态规划适用于能够分解为子问题的问题,并且子问题的解可以保存并复用。动态规划通过状态转移方程来计算最优解。
通俗理解:动态规划就像“做笔记”——把重复计算的结果记录下来,避免重复劳动。
核心思想:将大问题拆解为小问题,通过解决小问题逐步解决大问题,并保存中间结果(称为“状态”)。
1. 状态转移方程:
- 状态转移方程是用来描述从一个状态到另一个状态的关系。
- 通过状态转移方程,可以一步步得到最终的最优解。
二、爬楼梯问题
问题描述:
假设你正在爬楼梯,楼梯有 n 阶,每次可以爬 1 阶或 2 阶。你有多少种方法可以爬到楼顶?
思路分析:
- 对于楼梯的第 n 阶,你可以从第 n-1 阶跳一步,或者从第 n-2 阶跳两步。
- 所以,到达第 n 阶的方法数等于到达第 n-1 阶和第 n-2 阶的方法数之和。
状态转移方程:
f(n)=f(n−1)+f(n−2)f(n) = f(n-1) + f(n-2)
- f(n) 表示到达第 n 阶的总方法数。
- 初始条件:
- f(0) = 1(没有阶梯时有一种“爬”的方法,就是不动)
- f(1) = 1(只有一阶时,只有一种爬法)
代码实现:
public class ClimbingStairs {public static int climbStairs(int n) {if (n == 0) return 0; // 没有楼梯的情况if (n == 1) return 1; // 只有一阶的情况int first = 1; // f(1) = 1int second = 2; // f(2) = 2int result = 0;for (int i = 3; i <= n; i++) {result = first + second; // f(n) = f(n-1) + f(n-2)first = second; // 更新 f(n-1)second = result; // 更新 f(n-2)}return result;}public static void main(String[] args) {int n = 5; // 假设楼梯有 5 阶System.out.println(climbStairs(n)); // 输出结果}}
- 解释:
- 初始化 first = 1 和 second = 2,分别表示到达第 1 阶和第 2 阶的方法数。
- 通过循环从第 3 阶开始,根据状态转移方程 f(n) = f(n-1) + f(n-2) 计算到达每一阶的方法数,最终返回到达第 n 阶的总方法数。
时间复杂度: O(n)
空间复杂度: O(1)
这个解法通过空间优化,只用常数空间来存储前两个状态,因此是最优解。
三、斐波那契数列(Fibonacci Sequence)
问题描述:
斐波那契数列是一个经典的数列,定义如下:
f(0)=0f(1)=1f(n)=f(n−1)+f(n−2),n>=2f(0) = 0 f(1) = 1 f(n) = f(n-1) + f(n-2), n >= 2
即数列的前两个数字是 0 和 1,从第三项开始,每一项是前两项之和。计算第 n 项。
思路分析:
- 斐波那契数列和爬楼梯问题是同一种类型的问题。
- 第 n 项的数值是前两项之和,符合动态规划的最优子结构。
状态转移方程:
f(n)=f(n−1)+f(n−2)f(n) = f(n-1) + f(n-2)
代码实现(递归):
public class Fibonacci {// 递归实现public static int fib(int n) {if (n == 0) return 0;if (n == 1) return 1;return fib(n - 1) + fib(n - 2); // 递归调用}public static void main(String[] args) {int n = 6; // 求斐波那契数列的第 6 项System.out.println(fib(n)); // 输出结果}}
- 解释:
- 基本的递归实现,计算第 n 项的数值。
- 递归的时间复杂度是 O(2^n),因为每个递归会产生两个子问题,计算速度较慢。
改进:动态规划实现(记忆化递归)
public class FibonacciDP {public static int fib(int n) {int[] dp = new int[n + 1];dp[0] = 0; // f(0) = 0dp[1] = 1; // f(1) = 1for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2]; // 状态转移方程}return dp[n];}public static void main(String[] args) {int n = 6; // 求斐波那契数列的第 6 项System.out.println(fib(n)); // 输出结果}}
- 解释:
- 使用 动态规划 数组 dp 来存储中间结果,避免重复计算。
- 时间复杂度是 O(n),空间复杂度是 O(n)。
- 为什么使用n + 1:
- 索引从0开始:在Java中,数组的索引是从0开始的。因此,如果我们想要存储从第1项到第n项的解,我们需要一个长度为n + 1的数组,这样索引范围就是从0到n。
- 方便访问:使用n + 1的数组,我们可以直接使用dp[i]来访问第i项的解,而不需要进行额外的索引转换。
优化:空间复杂度 O(1)
public class FibonacciOptimized {public static int fib(int n) {if (n == 0) return 0;if (n == 1) return 1;int first = 0, second = 1; // f(0) = 0, f(1) = 1int result = 0;for (int i = 2; i <= n; i++) {result = first + second;first = second;second = result;}return result;}public static void main(String[] args) {int n = 6; // 求斐波那契数列的第 6 项System.out.println(fib(n)); // 输出结果}}
- 解释:
- 通过空间优化,只用两个变量 first 和 second 存储前两个斐波那契数值,减少了空间复杂度。
- 时间复杂度是 O(n),空间复杂度是 O(1)。
总结:
- 递归法: 直接递归实现,虽然简单,但由于大量重复计算,效率低。
- 动态规划(DP): 通过存储中间计算结果,避免重复计算,显著提高效率。
- 空间优化: 动态规划可以通过滚动数组技巧来优化空间复杂度。
时间复杂度: O(n)
空间复杂度: O(1)(优化后的解法)
四、常考点总结
知识点 | 内容 | 常见问题 |
状态转移方程 | 动态规划的核心是递推关系(例如:f(n) = f(n-1) + f(n-2)) | 题目能否用动态规划解决,是否存在最优子结构? |
爬楼梯问题 | 动态规划解法,关键是通过状态转移方程f(n) = f(n-1) + f(n-2)来计算 | 边界条件的处理,空间优化的使用 |
**斐波那契 |
动态规划解题步骤总结
定义状态:明确dp[i]表示什么(如斐波那契数、爬楼梯方法数)。
建立状态转移方程:找到dp[i]与dp[i-1]、dp[i-2]等的关系。
初始化:设置初始值(如dp[0]、dp[1])。
确定计算顺序:通常从前往后遍历。
空间优化:用变量代替数组(如滚动数组)。
常考题型
基础DP问题:斐波那契、爬楼梯、路径计数。
变种DP问题:最小路径和、背包问题简化版。
二维DP问题:网格中的动态规划(如机器人路径)。
动态规划的两个主要特征:
重叠子问题:问题可以分解为多个子问题,这些子问题不是独立的,而是相互重叠的。
最优子结构:问题的最优解包含其子问题的最优解。
爬楼梯问题
爬楼梯问题是一个经典的动态规划问题。假设你正在爬楼梯,每次可以爬1阶或2阶,问到达第n阶楼梯有多少种不同的方法。
解题思路:
状态定义:设dp[i]表示到达第i阶楼梯的方法数。
状态转移方程:dp[i] = dp[i-1] + dp[i-2],即到达第i阶的方法数等于到达第i-1阶和第i-2阶的方法数之和。
初始条件:dp[1] = 1(到达第1阶只有1种方法),dp[2] = 2(到达第2阶有2种方法:1+1或2
相关文章:
蓝桥杯 Java B 组之简单动态规划(爬楼梯、斐波那契数列)
Day 6:简单动态规划(爬楼梯、斐波那契数列) 动态规划(Dynamic Programming,简称 DP)是计算机科学中的一种算法设计思想,用来解决最优解问题,它的核心思想是将大问题分解为小问题&am…...
传统 I/O 和 NIO 的主要区别
在 Java 中,文件读写可以通过传统的 I/O 方式(如 InputStream 和 OutputStream)或 NIO(New I/O)方式(如 FileChannel)来实现。NIO 的 FileChannel 提供了更高效的文件操作方式,尤其是…...
0基础学LabVIEW
对于零基础的朋友来说,学习LabVIEW需要一个科学的学习路径和方法。通过观看优质的B站教程打好基础,再结合实际项目进行实践操作,能够快速提升LabVIEW的应用能力。以下是从入门到进阶的学习建议。 一、利用B站入门教程打基础 筛选优质教程…...
二〇二四年终总结
写在前面 简单总结一下告诉自己,曾经活着 不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树 原本应该 24 年年中的时候写 23 年年终的总结,但是一直拖着&…...
设计模式:状态模式
状态机有3个要素:状态,事件,动作。 假如一个对象有3个状态:S1、S2、S3。影响状态的事件有3个:E1、E2、E3。每个状态下收到对应事件的时候,对象的动作为AXY。那么该对象的状态机就可以用如下表格来表示。S1收到事件E1的…...
SQLite Select 语句详解
SQLite Select 语句详解 SQLite 是一个轻量级的数据库管理系统,以其简洁的设计和高效的性能被广泛应用于各种场景。在 SQLite 中,SELECT 语句是用于查询数据库中的数据的命令。本文将详细介绍 SQLite 的 SELECT 语句,包括其基本语法、常用功…...
【深度学习】计算机视觉(CV)-目标检测-Faster R-CNN —— 高精度目标检测算法
1.什么是 Faster R-CNN? Faster R-CNN(Region-based Convolutional Neural Network) 是 目标检测(Object Detection) 领域的一种 双阶段(Two-Stage) 深度学习方法,由 Ross Girshick…...
静默安装OGG for MySQL微服务版本,高效开展数据同步和迁移
一、背景 本文从Oracle GoldenGate微服务版的概念和组件介绍开始,从零介绍了怎么开始安装GoldenGate 21c for Oracle微服务版本的软件及部署。当然了,微服务版除新功能外包含传统版所有的功能。 二、安装部署 (一)下载OGG for …...
排序算法衍生问题
排序算法衍生问题 引言 排序算法是计算机科学中的基本问题之一,广泛应用于各种实际场景中。尽管有多种排序算法可供选择,但每种算法都有其特定的优势和局限性。本文将探讨排序算法中的一些衍生问题,包括算法效率、稳定性、内存占用等方面&a…...
DeepSeek自动化写作软件
DeepSeek写作软件的三大核心功能 对于内容创作者来说,写作不仅是表达思想的过程,更是一项需要投入大量时间和精力的任务。面对日益增长的内容需求,写作效率低下、内容质量不高等问题,常常让创作者感到焦虑。而 DeepSeek 写作软件…...
Python数据可视化 - Matplotlib教程
文章目录 前言一、Matplotlib简介及安装1. Matplotlib简介2. 安装Matplotlib 二、Matplotlib Pyplot1. Pyplot介绍2. Pyplot中方法介绍2.1 创建和管理图形2.2 绘制图形2.3 设置图形属性2.4 保存和展示 三、Matplotlib绘图标记1. 介绍2. 基本用法3. 标记大小与颜色4. 标记样式列…...
集成测试总结文档
1. 集成测试的定义 集成测试(Integration Testing)是在单元测试之后,将多个独立的软件模块或组件组合在一起进行测试的过程,目的是验证这些模块之间的接口、数据传递、协作逻辑是否符合设计要求,并发现因集成引发的缺…...
Retrieval-Augmented Generation for LargeLanguage Models: A Survey
标题:Retrieval-Augmented Generation for Large Language Models: A Survey 作者:Yunfan Gaoa , Yun Xiongb , Xinyu Gaob , Kangxiang Jiab , Jinliu Panb , Yuxi Bic , Yi Daia , Jiawei Suna , Meng Wangc , and Haofen Wang 1. By referencing ext…...
Day3 25/2/16 SUN
【一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵)】https://www.bilibili.com/video/BV13g41157hK?p4&v…...
使用maven-archetype制作项目脚手架
使用maven-archetype制作项目脚手架 maven plugin依赖 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-archetype-plugin</artifactId><version>3.0.1</version> </plugin>导出模板 在模板项目执行…...
Spring AOP源码解析
前言 Spring AOP(面向切面编程)是 Spring 框架的核心模块之一,其底层通过 动态代理 和 字节码增强 实现。以下是 Spring AOP 的源码解析,涵盖核心流程、关键类及实际应用场。 一、Spring AOP 的核心组件 核心接口 Joinpoint&am…...
1.buuctf [BJDCTF2020]EasySearch
进入题目页面如下 尝试输入弱口令密码都显示错误 看题目是search,扫描一下根目录试试 /index.php.swp 得到源码 进行一下代码审计 <?php//开启输出缓冲,将所有的输出内容先保存到缓冲区,而不是直接输出到浏览器。ob_start();//定义一个…...
小米 R3G 路由器刷机教程(Pandavan)
小米 R3G 路由器刷机教程(Pandavan) 一、前言 小米 R3G 路由器以其高性价比和稳定的性能备受用户青睐。然而,原厂固件的功能相对有限,难以满足高级用户的个性化需求。刷机不仅可以解锁路由器的潜能,还能通过第三方固…...
【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析③】
ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase03 作者:车端域控测试工程师 更新日期:2025年02月15日 关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-003测试用例 用例ID测试场景验证要点参考条款预期…...
deepseek与gpt,核心原理对比
DeepSeek与GPT作为AI大模型,在自然语言处理等领域展现出强大的能力,它们的核心原理对比主要体现在模型架构、训练策略、资源效率以及应用场景优化等方面。 一、模型架构 DeepSeek 混合专家(MoE)框架:DeepSeek采用了混合专家框架,其内部包含多个“专家”子模块,每个子模…...
第1章大型互联网公司的基础架构——1.1 单机房的内部架构
所谓的应用后台就是指机房。机房架构是一个庞大的工程,你可能听说过很多大型互联网公司曾在各种技术峰会上介绍它们的“三地五中心”多机房,甚至是全球异地多活机房等,这些“高大上”的话题讨论的都是机房架构的内容。机房最简单的形式是单机…...
如何在 Vue 3 中使用 Vue Router 和 Vuex
在 Vue 3 中使用 Vue Router 1. 安装 Vue Router 在项目根目录下,通过 npm 或 yarn 安装 Vue Router 4(适用于 Vue 3): npm install vue-router4 # 或者使用 yarn yarn add vue-router42. 创建路由配置文件 在 src 目录下创建…...
网络安全月度报告
3.1.1网络现状及安全挑战 网络的出现给人们的工作和生活带来了极大的便利,但同时也带来了极大的安全风险。在信息传输和交换时,需要对通信信道上传输的机密数据进行加密;在数据存储和共享时,需要对数据库进行安全的访问控制和对访…...
人大金仓国产数据库与PostgreSQL
一、简介 在前面项目中,我们使用若依前后端分离整合人大金仓,在后续开发过程中,我们经常因为各种”不适配“问题,但可以感觉得到大部分问题,将人大金仓视为postgreSQL就能去解决大部分问题。据了解,Kingba…...
Python的imutils库详细介绍
imutils 是一个专为简化OpenCV(计算机视觉库)常见操作而设计的Python工具库,提供了一系列便捷函数,使图像和视频处理更加高效和简洁。以下是对其功能、安装及用法的详细介绍: 1. 安装方法 通过pip安装: p…...
【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第三节】
ISO 14229-1:2023 UDS诊断服务测试用例全解析(安全访问0x27服务) 作者:车端域控测试工程师 更新日期:2025-02-12 关键词:UDS安全访问、0x27服务、ISO 14229-1:2023、ECU安全验证 一、服务概述 安全访问服务࿰…...
DeepSeek与医院电子病历的深度融合路径:本地化和上云差异化分析
一、引言 1.1 研究背景与意义 在医疗信息化快速发展的当下,电子病历系统已成为医院信息管理的核心构成。电子病历(EMR)系统,是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图标、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的…...
⚡️《静电刺客的猎杀手册:芯片世界里的“千伏惊魂“》⚡️
前言: 在这个电子产品无孔不入的时代,我们每天都在与一群隐形刺客打交道——它们身怀数千伏特的高压绝技,能在0.1秒内让价值百万的芯片灰飞烟灭。这就是静电放电(ESD),电子工业界最令人闻风丧胆的"沉默…...
GPU 英伟达GPU架构回顾
1999 年,英伟达发明了 GPU(graphics processing unit),本节将介绍英伟达 GPU 从 Fermi 到 Blackwell 共 9 代架构,时间跨度从 2010 年至 2024 年,具体包括费米(Feimi)、开普勒&#…...
Git 分布式版本控制
Git 是分布式版本控制 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据 总结 前言 git基本流程 本地git安装并将bin目录配置到环境变量path中,右键git bash后配置本地用户名与邮箱 git congig --global user.name "" || …...
【网络】协议与网络版计算器
协议与网络版计算器 文章目录 1.协议的概念 1.1序列化与反序列化 2.网络版计算器 2.1封装套接字2.2协议定制 2.2.1Jsoncpp2.2.2报文处理 2.3会话层:TcpServer2.4应用层:Calculate2.5表示层:Service2.6应用层、表示层和会话层->应用层 …...
AI语言模型的技术之争:DeepSeek与ChatGPT的架构与训练揭秘
云边有个稻草人-CSDN博客 目录 第一章:DeepSeek与ChatGPT的基础概述 1.1 DeepSeek简介 1.2 ChatGPT简介 第二章:模型架构对比 2.1 Transformer架构:核心相似性 2.2 模型规模与参数 第三章:训练方法与技术 3.1 预训练与微调…...
【Python爬虫(5)】HTTP协议:Python爬虫的基石
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
机器学习数学基础:24.随机事件与概率
一、教程目标 本教程致力于帮助零基础或基础薄弱的学习者,全面掌握概率论与数理统计的基础公式,透彻理解核心概念,熟练学会应用解题技巧,最终能够轻松应对期末或考研考试。 二、适用人群 特别适合那些对概率论与数理统计知识了…...
Mongodb数据管理
Mongodb数据管理 1.登录数据库,查看默认的库 [rootdb51~]# mongo> show databases; admin 0.000GB config 0.000GB local 0.000GB> use admin switched to db admin > show tables system.version > admin库:admin 是 MongoDB 的管理…...
vue3响应式丢失解决办法(三)
vue3的响应式的理解,与普通对象的区别(一) vue3 分析总结响应式丢失问题原因(二) 经过前面2篇文章,知道了响应式为什么丢失了,但是还是碰到了丢失情况,并且通过之前的内容还不能解…...
Django中数据库迁移命令
在 Django 中,数据库迁移是确保数据库结构与 Django 模型定义保持一致的重要过程。以下是 Django 中常用的数据库迁移命令: 1. python manage.py makemigrations 功能:此命令用于根据 Django 项目的模型文件(models.pyÿ…...
LLM之循环神经网络(RNN)
在人工智能的领域中,神经网络是推动技术发展的核心力量。今天,让我们深入探讨循环神经网络(RNN) 一、神经网络基础 (1)什么是神经网络 神经网络,又称人工神经网络,其设计灵感源于人…...
TDengine 客户端连接工具 taos-Cli
简介工具获取运行命令行参数 基础参数高级参数 数据导出/导入 数据导出数据导入 执行 SQL 脚本使用小技巧 TAB 键自动补全设置字符列显示宽度其它 错误代码表 简介 TDengine 命令行工具(以下简称 TDengine CLI)是用户操作 TDengine 实例并与之交互最简…...
Express 路由路径正则详解
在 Express 中,使用正则表达式可以定义更加灵活和复杂的路由。 1. 基本语法 在 Express 中,路由路径可以是一个字符串、字符串模式或者正则表达式。当使用正则表达式时,将其作为路由路径传入 app.METHOD() 方法(METHOD 可以是 g…...
快速设置 Docker 网络代理配置
Docker Client - 代理访问远程的 Docker Daemon 在 Client 端设置代理其实就是设置 Linux 系统的代理,从而让系统的命令行可以通过代理连接到外部的网络。一般只需要配置 HTTP_PROXY 与 HTTPS_PROXY 这两个即可。 临时生效: 在命令行中执行下面的命令&…...
JVM ②-双亲委派模型 || 垃圾回收GC
这里是Themberfue 在上节课对内存区域划分以及类加载的过程有了简单的了解后,我们再了解其他两个较为重要的机制,这些都是面试中常考的知识点,有必要的话建议背出来,当然不是死记硬背,而是要有理解的背~~~如果对 JVM …...
内容中台驱动企业数字化内容管理高效协同架构
内容概要 在数字化转型加速的背景下,企业对内容管理的需求从单一存储向全链路协同演进。内容中台作为核心支撑架构,通过统一的内容资源池与智能化管理工具,重塑了内容生产、存储、分发及迭代的流程。其核心价值在于打破部门壁垒,…...
人工智障的软件开发-自动流水线CI/CD篇-docker+jenkins部署之道
指令接收:「需要自动构建系统」 系统检测:目标开发一个软件已完成代码仓库-轻盈的gitea,开始添加自动流水线 启动应急冷却协议:准备承受Java系应用的资源冲击 核心组件锁定:构建老将军Jenkins(虽然年迈但依…...
数字人技术之LatentSync Win11本地部署
#LatentSync技术原理 字节跳动开源的基于音频条件潜在扩散模型的端到端唇同步框架,基于潜在扩散模型,以音频条件潜在扩散模型为基础,利用 Stable Diffusion 强大能力,直接建模复杂的音频与视觉之间的关系,实现高质量的唇形同步. 从而制作虚拟…...
Llama3.0论文学习笔记: The Llama 3 Herd of Models
1. 写在前面 今天分享Llama3.0的论文,2024.7月来自Meta的Llama团队,2025年1月DeepSeek R1出现之后,其风头显然已经盖住了Llama3,这时候整理Llama3感觉有点赶不上潮流了,但是我还是想整理下Llama3.0,原因是…...
C#学习之数据转换
目录 一、创作说明 二、数据类型之间的转换 1.数据类型之间的转换表格 2.代码示例 三、进制之间的转换 1.进制之间的转换表格 2.代码示例 四、ASCII 编码和字符之间的转换 1.ASCII 编码和字符之间的转换表格 2.代码示例 五、总结 一、创作说明 C#大多数时候都是和各…...
POI 和 EasyExcel
前言 将表格信息导出为Excel表格(导出数)将Excel表格信息录入到数据库(导入数据) 操作Excel目前比较流行的就是 Apache POI 和阿里巴巴的 EasyExcel Apache POI Apache POI 官网:https://poi.apache.org/ HSSF&am…...
分布式光纤传感:为生活编织“感知密网”
分布式光纤测温技术虽以工业场景为核心,但其衍生的安全效益已逐步渗透至日常生活。 分布式光纤测温技术(DTS)作为一种先进的线型温度监测手段,近年来在多个领域展现了其独特的优势。虽然其核心应用场景主要集中在工业、能源和基础…...
Web后端 - Maven管理工具
一 Maven简单介绍 Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。 Maven的作用 二 Maven 安装配置 依赖配置 依赖传递 依赖范围 生命周期 注意事项:在同一套生命周期中,当运行后面的阶段时,前面的阶段都…...