算法系列之动态规划
动态规划(Dynamic Programming,简称DP)是一种用于解决复杂问题的算法设计技术。它通过将问题分解为更小的子问题,并存储这些子问题的解来避免重复计算,从而提高算法的效率。本文将介绍动态规划的基本概念、适用场景、复杂度分析,并通过Java代码实现经典的动态规划问题。
动态规划介绍
动态规划的核心思想是将一个复杂的问题分解为若干个相互重叠的子问题,通过解决这些子问题来构建原问题的解。动态规划通常适用于具有以下两个性质的问题:
-
最优子结构:问题的最优解包含其子问题的最优解。
-
重叠子问题:在求解过程中,相同的子问题会被多次计算。
动态规划算法的实现方式:
- 自底向上(Bottom-Up):通过迭代的方式从最小的子问题开始,逐步构建更大的子问题的解,直到解决原问题。
复杂度分析
动态规划的时间复杂度和空间复杂度取决于问题的规模和子问题的数量。假设问题的规模为n,子问题的数量为m,则:
-
时间复杂度:通常为O(m * n),其中m是子问题的数量,n是每个子问题的计算复杂度。
-
空间复杂度:通常为O(m),用于存储子问题的解。
Java实现斐波那契数列
斐波那契数列:斐波那契数列的定义是从0和1开始,后续的每一项都是前两项的和,即0、1、1、2、3、5、8、13、21、34……这个数列在数学、自然界以及日常生活中都有着广泛的应用和意义。
我们通过动态规划和递归两种方式实现输入一个正整数 n ,输出斐波那契数列的第 n 项。
/*** 斐波那契数列** 斐波那契数列:斐波那契数列的定义是从0和1开始,后续的每一项都是前两项的和,即0、1、1、2、3、5、8、13、21、34……这个数列在数学、自然界以及日常生活中都有着广泛的应用和意义。** 输入一个正整数 n ,输出斐波那契数列的第 n 项。*/
public class FibonacciSequence {/***动态规划解法* @param n* @return*/public static int fibonacciDP(int n) {// 边界条件if (n <= 1) {return n;}//定义初始发f(n-2)的值int prev2 = 0;//定义初始发f(n-1)的值int prev1 = 1;//定义初始发f(n)的值int current = 0;// 循环计算斐波那契数列的第 n 项(f(n) = f(n-1)+f(n-2))for (int i = 2; i <= n; i++) {current = prev1 + prev2;prev2 = prev1;prev1 = current;}return current;}/***递归解法* @param n* @return*/public static int fibonacciRec(int n) {// 边界条件if (n <= 1) {return n;}//递归求解return fibonacciRec(n-1) +fibonacciRec(n-2);}public static void main(String[] args) {System.out.println(fibonacciDP(10));System.out.println(fibonacciRec(10));}}
⼯作安排问题
- 问题描述:
⼩明每周上班都会拿到⾃⼰的⼯作清单,⼯作清单内包含 n 项⼯作,每项⼯作都有对应的耗时时⻓(单位h)和报酬,⼯作的总报酬为所有已完成⼯作的报酬之和。那么请你帮⼩明安排⼀下⼯作,保证⼩明在指定的⼯作时间内⼯作收⼊最⼤化。
- 输入描述:
输⼊的第⼀⾏为两个正整数 T , n 。 T 代表⼯作时⻓(单位h, 0 < T < 100000 ) , n 代表⼯作数量( 1 < n < 3000 )
接下来是 n ⾏,每⾏包含两个整数 t , w 。 t 代表该项⼯作消耗的时⻓(单位h, t > 0 ) , w 代表该项⼯作的报酬。
- 输出描述
输出⼩明指定⼯作时⻓内⼯作可获得的最⼤报酬。
- 示例
示例1
输入:
40 3
20 10
20 20
20 5
输出:
30
示例2
输入:
100 3
50 10
20 30
50 20
输出:
50
- 代码实现
public class WorkArrangement {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 输⼊最⼤⼯作时间max_time和⼯作数量Nint max_time = scanner.nextInt();// ⼯作数量Nint N = scanner.nextInt();//工作时常数组int[] times = new int[N];//工资数组int[] wages = new int[N];// 输⼊N份⼯作的时间和报酬for (int i = 0; i < N; i++) {times[i] = scanner.nextInt();wages[i] = scanner.nextInt();}Map<Integer,Integer> dpMap = new HashMap<>();//初始化工作时长和工资dpMap.put(0,0);for(int i = 0; i< N; i++){// 复制当前的dpMapMap<Integer, Integer> currentDP = new HashMap<>(dpMap);//当前工作的时长和工资int time = times[i];int wage = wages[i];// 遍历当前currentDP哈希表中,所有的时间和报酬for(Map.Entry<Integer, Integer> entry: currentDP.entrySet()){int preTime = entry.getKey();int preWage = entry.getValue();// 当前的结束时间int endTime = preTime + time;// 当前结束时间对应的工资int endWage = preWage + wage;// 如果结束时间不超过最大时间,则更新dpMapif(endTime <= max_time){dpMap.put(endTime, Math.max(dpMap.getOrDefault(endTime,0),endWage));}}}// 输出dpMap哈希表中的最⼤值int maxWage = 0;for (int wage : dpMap.values()) {maxWage = Math.max(maxWage, wage);}System.out.println(maxWage);}
}
总结
动态规划是一种强大的算法设计技术,适用于解决具有最优子结构和重叠子问题性质的问题。通过合理地分解问题和存储子问题的解,动态规划可以显著提高算法的效率。本文通过斐波那契数列和工作安排问题展示了动态规划的基本思想和Java实现。希望本文能帮助你更好地理解和应用动态规划算法。
相关文章:
算法系列之动态规划
动态规划(Dynamic Programming,简称DP)是一种用于解决复杂问题的算法设计技术。它通过将问题分解为更小的子问题,并存储这些子问题的解来避免重复计算,从而提高算法的效率。本文将介绍动态规划的基本概念、适用场景、复…...
网站漏洞安全测试 具体渗透思路分析
渗透测试这些是经常谈到的问题了,我觉得当有了渗透接口测试之后你就会发现渗透测试这一方面也就是:1.基本漏洞测试;2.携带"低调"构思的心血来潮;3.锲而不舍的信念。我们在对网站,APP进行渗透测试的过程中会发…...
Spring Boot(七):Swagger 接口文档
1. Swagger 简介 1.1 Swagger 是什么? Swagger 是一款 RESTful 风格的接口文档在线自动生成 功能测试功能软件。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。目标是使客户端和文件系统作为服务器以同样的…...
【Mac电脑本地部署Deepseek-r1:详细教程与Openwebui配置指南】
文章目录 前言电脑配置:安装的Deepseek版本:使用的UI框架:体验效果展示:本地部署体验总结 部署过程Ollama部署拉取模型运行模型Openwebui部署运行Ollama服务在Openwebui中配置ollama的服务 后话 前言 deepseek最近火的一塌糊涂&a…...
测试的BUG分析
在了解BUG之前,我们要先了解软件测试的生命周期,因为大多数BUG都是在软件测试的过程中被发现的 软件测试的生命周期 在了解 软件测试的生命周期 之前,我们要先了解 软件的生命周期 ,虽然他们之间只差了两个字,但是差距还是很大的 首先是 软件生命周期 ,这个是站在 软件 的角…...
linux里面的过滤符号 | 是如何实现的
ls -l | grep ".txt" 的实现过程涉及无名管道的创建、进程的创建(fork())以及输入输出的重定向(dup2())。以下是详细的实现步骤和代码示例: 实现步骤 创建无名管道: 使用pipe()系统调用创建一个无…...
结构型模式--组合模式
概念 组合人模式是结构型设计模式的一种,主要是用于解决代码中出现类像树一样进行组合而出现的组合结构的相关操作问题。使其树中的任意一个节点(无论是子节点还是父节点)都可以使用同一套接口进行操作。 使用场景 1、如果希望我们对象组合…...
drupal可以自动将测试环境的网页部署到生产环境吗
在 Drupal 中,自动将测试环境的网页部署到生产环境通常是通过设置合适的开发和部署流程来实现的。这种自动化部署过程通常涉及以下几个步骤: 1. 版本控制(Git) 为了保证测试环境和生产环境的一致性,首先需要使用 Git…...
Android应用app实现AI电话机器人接打电话
Android应用app实现AI电话机器人接打电话 --安卓AI电话机器人 一、前言 【Dialer3.0智能拨号器】Android版手机app,由于采用蓝牙电话的方式来调用手机SIM卡发起呼叫、接听来电,并接收和处理通话的声音,通常我们以“蓝牙电话方案”来称呼它。 …...
【面试宝典】Java中创建线程池的几种方式以及区别
强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能 创建线程池有多种方式,主要通过 Java 的 java.util.concurrent 包提供的 Executors 工具类来实现。以下是几…...
【数据结构】哈希表
目录 哈希表 基本思想 基本原理 哈希表工作机制简化描述 关于查找、插入和删除 HashMap 主要成员变量 主要方法 内部实现细节 注意事项 哈希表 哈希表是一种基于哈希函数的数据结构,它通过键值对的形式存储数据,并允许通过键快速查找对应的值…...
MySQL 使用 `WHERE` 子句时 `COUNT(*)`、`COUNT(1)` 和 `COUNT(column)` 的区别解析
文章目录 1. COUNT() 函数的基本作用2. COUNT(*)、COUNT(1) 和 COUNT(column) 的详细对比2.1 COUNT(*) —— 统计所有符合条件的行2.2 COUNT(1) —— 统计所有符合条件的行2.3 COUNT(column) —— 统计某一列非 NULL 的记录数 3. 性能对比3.1 EXPLAIN 分析 4. 哪种方式更好&…...
RabbitMQ系列(一)架构解析
RabbitMQ 架构解析 RabbitMQ 是一个基于 AMQP 协议的开源消息中间件,其核心架构通过多组件协作实现高效、可靠的消息传递。以下是其核心组件与协作流程的详细说明: 一、核心组件与功能 Broker(消息代理服务器) RabbitMQ 服务端核…...
如何让传统制造企业从0到1实现数字化突破?
随着全球制造业不断向智能化、数字化转型,传统制造企业面临着前所未有的机遇与挑战。数字化转型不仅是技术的革新,更是管理、文化、业务流程等全方位的变革。从零开始,如何带领一家传统制造企业走向数字化突破,是许多企业领导者面…...
基于Spring Boot的二手物品交易平台设计与实现(LW+源码)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
释放 Cursor 的全部潜能:快速生成智能 Cursor Rules
释放 Cursor 的全部潜能:使用 PromptCoder 从 package.json 快速生成智能 Cursor Rules 我们将深入探讨如何利用您项目中的 package.json 文件,轻松生成 Cursor Rules,并通过 PromptCoder 这个强大的工具,快速创建高质量的 curso…...
C#高级:结合Linq的SelectMany方法实现笛卡尔积效果
一、笛卡尔积定义 又称直积,表示为X Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 二、基础示例 class Program {static void Main(string[] args){try{List<List<string>> input new List<List<string&g…...
【洛谷入门赛】B4018 游戏与共同语言
题意 这里有两个队伍分别叫 A 和 B。 分别给定这两个队伍的胜利数、净胜局、平局数量。 求哪个队更厉害,就输出哪个。 具体比较规则如下: 两队中胜利数高的队伍更厉害。 若胜利数相同,净胜数高的队伍更厉害。 若净胜数仍然相同&#x…...
Python学习总结
客户端与服务端聊天窗口 服务端 导入 wxPython 用于创建图形界面。 socket 用于网络通信,AF_INET 是 IPv4 地址族,SOCK_STREAM 表示流式套接字(TCP)。 利用wxPython 创建图形界面,并通过 socket 与服务器通信。 主要…...
android系统_模拟ZygoteServer写一个socket通信
目录 一,模拟ZygoteServer 二,Client 代表app 三,输出结果 四,结束语 一,模拟ZygoteServer ZygoteServer,不断的监听来自客户端的请求 package org.study.tiger;import java.io.*; import java.net.*; import java.util.concurrent.*;import java.io.*; impor…...
LangChain教程 - RAG - PDF问答
系列文章索引 LangChain教程 - 系列文章 在现代自然语言处理(NLP)中,基于文档内容的问答系统变得愈发重要,尤其是当我们需要从大量文档中提取信息时。通过结合文档检索和生成模型(如RAG,Retrieval-Augment…...
李代数(Lie Algebras)与Attention:深度学习中的数学之美
李代数与Attention:深度学习中的数学之美 引言 作为一名深度学习研究者,您一定对Transformer模型和其中的注意力机制(Attention)不陌生。Attention通过查询(Query)、键(Key)和值&a…...
docker本地镜像源搭建
最近Deepseek大火后,接到任务就是帮客户装Dify,每次都头大,因为docker源不能用,实在没办法,只好自己搭要给本地源。话不多说具体如下: 1、更改docker的配置文件,添加自己的私库地址,…...
监督学习单模型—线性模型—LASSO回归、Ridge回归
目标变量通常有很多影响因素,通过各类影响因素构建对目标变量的回归模型,能够实现对目标的预测。但根据稀疏性的假设,即使影响一个变量的因素有很多,其关键因素永远只会是少数。在这种情况下,还用传统的线性回归方法来…...
StableDiffusion打包 项目迁移 项目分发 1
文章目录 SD项目迁移前置知识webui-user.batwebui.batlaunch_utils.py 下一篇开始实践 SD项目迁移 显卡驱动更新:https://www.nvidia.cn/geforce/drivers/ 下载安装三个程序: python3.10.6: https://www.python.org/downloads/release/python-3106/gi…...
【C++】模板初阶
文章目录 一. 泛型编程1.1 什么是模板1.2 为什么要使用模板 二. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.4.1 隐式实例化2.4.2 显式实例化 2.5 模板参数的匹配原则 三. 类模板3.1 类模板的定义格式3.2 类模板的实例化3.3 在类模板外…...
STM32学习【4】ARM汇编(够用)
目录 ARM汇编语言基础写在前面 1. ARM汇编的分类2. 关于指令集指令集切换Thumb2指令集统一汇编语言(UAL)常用汇编指令 3. 汇编格式立即数与伪指令 4. 操作内存的汇编指令LDR:从内存加载数据到CPU寄存器STR:将数据从寄存器存储到内…...
傅里叶分析
傅里叶分析之掐死教程(完整版)更新于2014.06.06 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是,傅里叶分析的公式看起来太复…...
Jmeter插件下载及安装
1、在Jmeter官网(Install :: JMeter-Plugins.org)下载所需插件 2、将下载的插件复制到jmeter文件下的lib/ext文件里(PS:D:\Jmeter\apache-jmeter-5.6.2\lib\ext) 3、打开Jmeter,选择 选项----Plugins Manag…...
Docker迁移/var/lib/docker之后镜像容器丢失问题
迁移/var/lib/docker时,如果目标目录少写一个/,/etc/docker/daemon.json中的data-root后面需要多加一级目录docker。 若迁移命令如下 rsync -avz /var/lib/docker /home/docker/ 在/etc/docker/daemon.json中添加如下内容 "data-root": &q…...
【C++】深入理解List:双向链表的应用
凭时间赢来的东西,时间肯定会为之作证。 前言 这是我自己学习C的第七篇博客总结。后期我会继续把C学习笔记开源至博客上。 上一期笔记是关于C的vector类知识,没看的同学可以过去看看:【C】探索Vector:灵活的数据存储解决方案-CS…...
如何使用 Ollama 的 API 来生成文本
如何使用 Ollama 的 API 来生成文本 简介 生成文本 生成文本的示例 加载模型 卸载模型 简介 Ollama 提供了一个 RESTful API,允许开发者通过 HTTP 请求与 Ollama 服务进行交互。这个 API 覆盖了所有 Ollama 的核心功能,包括模型管理、运行和监控。本…...
Redis除了做缓存还有哪些应用场景
我用「现实场景代码简例」帮你彻底掌握Redis的18般武艺。先记住这句话:Redis是数据结构的瑞士军刀。以下分7大核心应用方向讲解: 一、高频面试答案速记版 1. 分布式锁 → 超市储物柜机制 2. 计数器 → 直播间点赞统计 3. 排行榜 → 游戏战力榜 4. 消息队…...
软件工程复试专业课-测试
测试 1 软件质量2 黑盒测试2.1 概念2.2 等价划分类 2.3 边值分析2.4 错误推测2.5 因果图 3 白盒测试3.1概念3.2 覆盖标准3.2.1 语句覆盖3.2.2 判断覆盖3.2.3 条件覆盖3.2.4 判定/条件覆盖3.2.5 条件组合覆盖3.2.6 路径覆盖 4 软件测试的四个阶段5 测试工具 1 软件质量 定义&…...
html css js网页制作成品——HTML+CSS甜品店网页设计(5页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Maven的传递性、排除依赖、生命周期、插件
一、Maven的传递性 蓝色背景中的两个jar包是projectA的直接依赖,其余的Jar包是projectA的间接依赖。 projectA可以使用直接依赖,也可以使用间接依赖。 maven-projectB项目引入了maven-projectC(整个项目打成了jar包)和junit两个jar包。 ma…...
Java 调试模式下 Redisson 看门狗失效
一、场景分析 前几天在做分布式锁测试: 在调试模式下,lock.lock() 之后打上断点,想测试一下在当前线程放弃锁之前,别的线程能否获取得到锁。 发现调试模式下,看门狗机制失效了,Redis 上 30 秒后࿰…...
PHP下载安装以及基本配置
目录 引言 官网 下载 配置 1. 鼠标右键“此电脑”>“属性” 2. 打开高级系统设置 3. 打开环境变量 4. 双击系统变量中的path 5. 新建新的path 6. 将刚刚安装的位置加入环境变量 7. 检查是否安装成功 引言 PHP(“PHP: Hypertext Preprocessor”&#…...
Vue nextTick原理回顾
nextTick就是将异步函数放在下一次实践循环的微任务队列中执行 实现原理比较简单,极简版本: function myNextTick(cb){let p;pPromise.resolve().then(cb)return cb?p:Promise.resolve() }复杂版本,考虑异步函数入队、执行锁、兼容处理 l…...
【Javascript】js精度丢失
当JS处理大整数或者浮点数的时候会出现精度丢失的情况。 Javascript的数字都使用双精度浮点数表示,遵循IEEE754标准 比如我遇到的问题,对一个小数的四舍五入,保留2位小数: 235.985≈235.98 235.9851≈235.99 原理请大家参考百度&…...
Go在1.22版本修复for循环陷阱
记录 前段时间升级Go版本碰到一个大坑,先记录。 先上代码案例: func main() {testClosure() }func testClosure() {for i : 0; i < 5; i {defer func() {fmt.Println(i)}()} }在1.22之下(不包括1.22)版本: 输出的…...
服务器离线部署DeepSeek
目标 本次部署的目标是在本地服务器上部署DeepSeek。但是该服务不能连接外网,因此只能使用离线部署的方式。为了一次完成部署。现在云服务器上进行尝试。 云服务器部署尝试 云服务器配置 CentOS72080Ti 11GB 安装准备 1、上传iso并配置为本地yum源 安装前先将…...
PhotoDoodle: Learning Artistic Image Editing from Few-Shot Examples 论文解读
目录 一、概述 二、PhotoDoodle 1、OmniEditor的预训练 2、DiT重点 3、无噪声条件范式与CFM 4、EditLoRA 4.1关于LoRA 4.2关于EditLoRA 三、相关工作 一、概述 风格化图像编辑的论文! 介绍了PhotoDoodle,一个基于扩散模型的图像编辑框架&#x…...
的pythonAPI文档含义
Open3D的pythonAPI文档含义 Open3D的pythonAPI文档含义1、相关文档1.[Open3D的python文档]2 [Open3D的cpp文档] 2、结论 >> 看了好久的文档,奶奶的什么个意思。1. class Type是一个枚举类,PointCloud等是枚举成员,每个成员在python有 n…...
跟着AI学vue第十三章
第十三章:技术传承与行业影响力塑造 到了这个阶段,你已经在Vue技术领域积累了深厚的经验,拥有了较强的技术实力。此时,你的重点将是把自己的知识和经验传递给更多人,在行业内树立起影响力,推动整个Vue技术…...
实现实时数据仓库开源项目
根据你的需求,以下是一些可以实现类似 ClickHouse 的实时数仓功能的项目,这些项目提供了高性能的数据处理和分析能力,适合实时数据仓库的场景: 1. Apache Doris Apache Doris 是一个开源的实时数据仓库,支持高吞吐量…...
实现了一个自适应的NOC路由机制,包括构建流量图、设计拥塞预测模型、优化路由策略和评估性能
以下是针对设计和实现自适应的网络 - on - chip (NOC) 路由机制的详细步骤及代码示例: 1. 分析NOC路由路径拥塞的原因及传统方法的不足之处 拥塞原因: 动态流量变化:芯片内不同模块的工作负载随时间变化,导致局部流量突然增加。…...
光速解决phpstudy无法启动MySQL服务
问题描述 在初步安装使用phpstudy时,会出现mysql服务启动失败的情况,具体表现为点击一键启动后,mysql启动又立即停止 原因及解决方法: phpstudy数据库无法启动有以下几个原因,可以看看自己是第几种: 服务名…...
2022 年 9 月青少年软编等考 C 语言五级真题解析
目录 T1. 城堡问题思路分析T2. 斗地主大师思路分析T3. 玩具摆放思路分析T4. 哥斯拉大战金刚思路分析T1. 城堡问题 1 2 3 4 5 6 7 ############################# 1 # | # | # | | ######---#####---#---#####---# 2 # # | # # # # ##…...
【原创】Ubuntu 24搭建Ollama+ DeepSeek局域网服务器
安装Ubuntu 服务器 通过ubuntu官网下载ubuntu 24服务器版本 刻录光盘(也可以使用U盘) 用光盘启动PC机器(必须是带显卡的PC机,包括集成Intel显卡的也行,纯CPU计算的服务器基本上不能使用) 最小化安装Ubuntu…...