经典算法之动态规划(一):入门级动态规划

LeetCode经典算法题目一(字符串、数组、链表、栈、队列、哈希) 最近开始刷LeetCode,回顾了一下被我遗忘在角落里的数据结构和算法,还包括java的一些基础语法,为了避免刷完了题又忘,所以就想在这里总结一下做过的题目,文中出现的所有代码均是用java编写,有不对的地方欢迎指正。 业精于勤,荒于嬉;行成于思,毁于随。每天保持思考、学无止境、持续更新…… 1.回文数 回文数是指:正序和倒序都是一样的数。 算法: 初始化y(倒序)为0,循环计算: y=y*... 阅读详情

终于要写高大上的动态规划啦~~虽然面对高难度的题目还是没底,但是简单的可用一维数组记录各子问题的解的入门级动态规划是已经OK的啦~下面以一个钢条切割的问题为例来讲述动态规划。

假设一公司进了一批长为10的钢条,打算切割然后去卖,各种长度的钢条的价格如下表: 

12345678910
1589101717202425

分析一下:长度为i 的钢条的价格记为r[i],假设总长度为u 的钢条经最优方案切割后总价格为price[u],显然price[10] 即为所求。对于长度为i 的钢条,其切割的方案有太多种,切一刀,切两刀……各刀分别切在哪里等等,这里我们只考虑第一刀切在哪里,这样方案就变成了i 种,而切完第一刀之后剩下的部分,又成了一个和原问题一样的子问题,假设第一刀切掉了i-u,余下的部分是u,我们再知道长度为u的钢条的最优价格就OK了,而由于我们是从小到大开始计算的,当计算price[i]时,price[u] (u<i)早已计算完毕。代码如下:

public class CutSteel {

	static int[] r = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 25};
	static int[] price = new int[11];
	static int length = 0;//第一刀切在哪里
	static int[] lengths = new int[11];
	public static void main(String[] args) {
		cut();
		System.out.println(price[10]);
		for(int i=0; i<11; i++){
			System.out.print(lengths[i]+" ");
		}
	}
	private static void cut() {
		price[1] = 1;
		for(int i=2; i<=10; i++){
			int max = r[i];
			length = 0;
			for(int u=1; u<i; u++){
				if(r[i-u]+price[u]>max){
					max = r[i-u]+price[u];
					length = i-u;
				}
			}
			price[i] = max;
			lengths[i] = length;
		}
	}
}


得到的结果是:

27
0 0 0 0 2 3 0 6 6 6 6

lengths[10]=6,也就是说长度为10的钢条第一刀切掉长度为6的部分,剩下长度为4,而lengths[4]=2,也就是说再切掉长度为2的部分,lengths[2]=0,也就是说不用再切了,于是最优的切割方案是切成6,2,2长的钢条,可卖得价格27

动态规划经典例题汇总 (附最全题目链接) 本文总结了王道机试指南中动态规划(Dynamic Progamming)部分的所有例题。 一.基本思想 与分治法类似,其基本思想也是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解中得到原问题的解。 与分治法不同的是,分治法会使得有些子问题被重复计算多次。而动态规划的做法是将已解决子问题的答案保存下来,在需要子问题答案的时候便可直接获得,而不需要重复计算,节约效率。 二.经典题目 ... 阅读详情

相关推荐

动态规划入门篇

大家好,我是耀星,相信大家在学习算法时会遇到很多的问题,当然我在学习时也会遇到问题, 动态规划与递归的关系 动态规划和递归非常的相似,都是通过组合子问题的解来求解原问题,且一般递归的问题都可以转化为动态规划,咱们举个简单的例子👇斐波那契数列。 第i个斐波那契数列值F[i]=F[i-1]+F[i-2],如果我们想知道F[n],那么我们就必须要知道F[n-1]和F[n-2]的值,如果采用递归的思路,将F[n]拆分成求F[n-1]+F[n-2],将原问题拆分成子问题求解,不同的子问题又有公...

qq_52763385的博客 5888

7.算法——动态规划,一维,二维,分割类问题,子序列问题,背包问题,字符串问题,股票问题,练习

算法解释 动态规划和其它遍历算法(如深/广度优先搜索)都是将原问题拆成多个子问题然后求解,他们之间最本质的区别是,动态规划保存子问题的解,避免重复计算。 解决动态规划问题的关键是找到状态转移方程,这样我们可以通过计算和储存子问题的解来求解最终问题。 同时,我们也可以对动态规划进行空间压缩,起到节省空间消耗的效果。 在一些情况下,动态规划可以看成是带有状态记录(memoization)的优先搜索。状态记录的意思为,如果一个子问题在优先搜索时已经计算过一次,我们可以把它的结果储存下来,之后遍历到该子问题的时候可

strive for the best 的博客 1016

十大经典算法的Python实现及详解

十大经典算法的Python实现及详解

燕鹏 2032

[算法]动态规划以及常见例题

之前买的假书害人捏......不过有个问题没说错,动态规划和递归很相似,但是动态规划利用分治法一个子任务的结果将储存避免对于同一个子任务的重复计算但其实根据某本书的写法,就是给递归套了一层存储的壳子......个人感觉这个做法不是很地道,递归可以理解为从上而下进行的,从大任务开始,然后等待着小任务的的返回结果确认大任务的值.而动态规划可以理解为自下而上进行的,先去计算小任务,再去计算大任务的结果关于转移方程:怎么从小任务里面推出大任务的方式。

weixin_62697030的博客 1484

经典算法详解——动态规划

蒟蒻说算法—动态规划: 动态规划的基本概念: 动态规划的基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解反推出原问题的解,与分治法极其相似。 动态规划算法通常用于求解具有多阶段最优性质的问题.在这类问题中,可能会有不止一种可行解.每一个解都对应于一个值,题目希望找到具有最优值的解。比如说你要从A地到Z地,但你不能直达我知道你想坐飞机 ,你希望路程最短,下面提供3种方法...

jerry20183的博客 372

直击高频编程考点:动态规划经典算法题总结

动态规划基本理解分析以及应用举例,同时给出高频笔试考题解法分析和代码展示验证(最大子序和、最长上升子序列、最长公共子序列、最大子数组乘积、分割整数的最大乘积、最长有效括号、不同路径、最小路径和、最大矩形、0-1背包问题、编辑距离、单词拆分、爬楼梯、打家劫舍、强盗抢劫环形街区、股票买卖问题、最佳买卖股票时机含冷冻期、找零钱的最少硬币数、从起点到终点的最小路径数等)

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 5万+

动态规划算法——吐血万字教程

首先,什么是动态规划?很简单,就是动态的规划。呃.....概念名不要紧,重要的是理解其算法思想,并且能够灵活的运用其思想和方法来处理和解决现实生活中的问题,即改造世界。动态规划的思想,具有很强的抽象性,例如什么重复子结构、最优子结构等等,你一听就晕了,这什么玩意?一般来说,学校的课程教学,很学院派。通常是直接灌输式的给你一个世界观和方法论,然后直接让你去屠龙。这个是一个超越经验的东西,直接给你了。但是,我们并不能理解这个结论,因为太抽象。

qq_51216031的博客 2712

STK中的传感器与通信组件:雷达、发射机、接收机与天线的协同建模

本文深入解析了STK软件中传感器、雷达、发射机、接收机与天线的协同建模方法。通过构建一个完整的卫星对地数传系统实例,阐述了各组件如何分工协作,实现从几何指向到射频链路的高保真仿真,为复杂航天通信与探测系统的设计与分析提供了高效、灵活的解决方案。

weixin_29271263的博客 273

经典中的经典算法:动态规划(详细解释,从入门到实践,逐步讲解)

动态规划的重要性就不多说,直接进入正题 首先,我们看一下官方定义:定义: 动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。 动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。基本思想与策略编辑: 由于动态

Jiguoyuanyic的博客 4万+

基于labview实现MYSQL数据库查询功能

基于labview实现MYSQL数据库查询功能 前言: labview是一款功能强大的图形化编程软件,也就是俗称的G语言。 本篇将介绍如何利用labview对MYSQL进行列表分页,范围查询及模糊查询等几个可广泛应用的简易功能,但事实上labview并不擅长处理数据库,下面详细代码可体现。 数据库的环境配置方面的问题这里就不赘述了。 我们直接进入主题。 1.以下为查询界面 2.分页实现细节: ...

qq470783138的博客 7556

UG NX与PLC-1500的在环虚拟测试

TIA、PLCSIM、NetToPLCsim、KEPServerEX以及UG NX的在环虚拟测试

lvtlvtlvtlvt的博客 4219

动态规划的一些经典算法

文章目录装配线调度矩阵链相乘 装配线调度 求解一个制造问题。汽车公司在有两条装配线的工厂内生产汽车,如图所示。一个汽车底盘在进入每一条装配线后,在一些装配站中会在底盘上安装部件,然后,完成的汽车在装配线的末端离开。每一条装配线上有n个装配站,编号为j=1,2,⋯,n。将装配线i(i为1或2)的第j个装配站表示为Si,j,装配线1的第j个站(S1,j)和装配线2的第j个站(S2,j)执行相同的功...

YABAJ的专栏 947

专访高性能计算专家赵开勇:无人机/机器人开发实战,如何优化深度学习?

从能够自主飞行的无人机,到能和小朋友玩物体识别等游戏的机器人,极客们对智能设备追求没有止境。除了轻巧的体积、超长的续航,更重要的是要有一个智能的“大脑”,来实现人类能够想得到的人机交互,或者智能化的自主决策和行为动作,毫无疑问强大的深度学习能力不可或缺。那么,拒绝束缚人类想象力的嵌入式智能设备,其开发工作需要什么样的环境和工具?开发者进行相关开发的可行思路是什么?近日,优快云记者就此专访了智能设...

happytofly的博客 3509

经典算法——动态规划入门实例

title: 经典算法——动态规划入门实例date: 2017-09-06 12:10:33categories: 算法tags: 动态规划 算法 经典算法——动态规划入门实例 经典算法动态规划入门实例神马是动态规划 求解最长公共子串 求解最大公有子序列 总结 神马是动态规划 专业定义:动态规划的本质,是对问题状态的定义和状态转移方程的定义。通过拆分问题,定义问题状态和状态之间的关系,使得问题能够

床边的扁豆的博客 1280

如何完全卸载axure软件以及解决安装axure后打不开的问题【2023年】

如何完全卸载axure软件以及解决安装axure后打不开的问题【2023年】

念兮为美 5139

YOLO系列算法改进 | Neck改进篇 | 融合FAAFusion傅里叶角度对齐模块 | 攻克多尺度方向特征冲突,角度检测精度飙升! | CVPR 2026

YOLO系列算法改进 | Neck改进篇 | 融合FAAFusion傅里叶角度对齐模块 | 攻克多尺度方向特征冲突,角度检测精度飙升! | CVPR 2026 (以YOLO26最新目标检测模型为基础,利用FAAFusion傅里叶角度对齐模块改进Neck部分)

2502_91881744的博客 315

经典算法题总结:回溯,动态规划篇

动态规划(Dynamic Programming,简称DP)是一种通过将复杂问题分解为更小的子问题来解决问题的算法设计方法。与分治法类似,动态规划也将问题分解,但不同的是,动态规划适用于那些子问题重叠的情况,即同一子问题会被多次计算。通过记忆化技术(Memoization)或自底向上(Bottom-Up)的方式,动态规划可以显著减少计算量。

技术研究记录 870

【示波器专题】无源探头的常用附件

使用探头进行测试,我们不仅要知道探头的原理,还需要了解探头的常用附件及其使用方式,这样才能在尽可能在测试中提高效率且减少出错的概率

一点硬件 692

动态规划经典算法

动态规划经典算法案例 动态规划算法是从暴力搜索算法优化过来的,如果我们不清楚暴力搜索的过程,就难以理解动态规划的实现,当我们了解了动态规划算法的基本原理的文字概述,实现条件之后,这时可能并不是太理解这种思想,去面对实际问题的时候也是无从下手,这个时候我们不能停留在文字层面上,而应该去学习经典动态规划算法的实现,然后倒回来看这些概念,便会恍然大悟。 动态规划算法的难点在于 从实际问题中抽象出动态规划...

qq_38903177的博客 222

【国产MCU】-认识CH32V307及开发环境搭建

CH32V307是[沁恒](https://www.wch.cn/)推出的一款基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度。加入单精度浮点指令集,扩充堆栈区,具有更高的运算性能。扩展串口UART数量到8组,电机定时器到4组。提供USB2.0高速接口(480Mbps)并内置了PHY收发器,以太网MAC升级到千兆并集成了10M-PHY模块。

视觉与物联智能 2343

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

经典算法之—动态规划

动态规划是一种求解多阶段决策问题的最优化算法。 一.多阶段决策过程 事件的发展过程分为若干个相互联系的阶段。事件的发展总是初始状态开始,依次经过第一阶段、第二阶段、第三阶段、 …,直至最后一个阶段结束。 如图1所示:   图1 二.动态规划术语及性质 为了更好说明问题,我们引入几个术语: (1)阶段:把所给求解问题的过程恰当地分成若干个相互联系的阶段。如图1所示V1、V2……。值得注

呵呵 1618

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

五大经典算法总结

       马上要开始投简历找实习了,自己还是毛都不会,慌得一笔,从今天开始每天刷2道以上的leetcode然后总结,并且总结各种面试题的知识点,以后常复习,加油。        在刷leetcode时经常看到有人说DP,然后去百度了DP是个啥,才知道DP是五大经典算法之一,今天开始总结一下五大经典算法。        五大经典算法分为1、分治法:把一个复杂的问题分成两个或更多的相同或相似的子问...

SKCSKAXLJ的博客 5534

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LeetCode经典算法题目二(树、排序、查找、动态规划、回溯、贪心)

LeetCode之树、排序、查找四、树1. 相同的树2. 对称二叉树3. 二叉树的最大深度(★)4. 将有序数组转换为二叉搜索树5. 平衡二叉树6. 二叉树的最小深度7. 路径总和8. 二叉树的镜像(★★)9. 合并二叉树(★)10. 二叉树中第二小的节点(★)11. 重建二叉树(★)12. 二叉树的层平均值(★)五、排序1. 交换排序——冒泡排序(★)2. 交换排序——快排(★★★)3. 选择排...

yy2017220302028的博客 5003

五大经典算法(贪婪、动态规划、分治、回溯、分支限界法)及其联系和比较

一、贪心法 贪心算法的定义: 贪心算法(也叫贪婪算法)是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到全局最优解,得到的是局部最优解,关键是贪心策略的选择,不同的贪婪策略会导致得到差异非常大的结果。选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 解题的一般...

vivian_ll的博客 2万+

经典算法7:动态规划之多段图

一.实验要求 1. 理解最优子结构的问题。 有一类问题的活动过程可以分成若干个阶段,而且在任一阶段后的行为依赖于该阶段的状态,与该阶段之前的过程如何达到这种状态的方式无关。这类问题的解决是多阶段的决策过程。在50年代,贝尔曼(Richard Bellman)等人提出了解决这类问题的“最优化原理”,从而创建了最优化问题的一种新的算法设计方法-动态规划。 对于一个多阶段过程问题,是否可以分段实现

momocsdn 1万+

五大经典算法-动态规划 及其算法应用

整篇文章分析整个动态规划算法,什么是动态规划,及动态规划算法在字符串匹配中使用、分治法的差别点、动态规划优点;

踩踩踩从踩的博客 4877
上一篇: 求一个集合的所有子集(java实现)
下一篇: kafka集群安装配置
热血大婶
博客等级 码龄16年 58粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血大婶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值