代码随想录算法训练营第三十一天丨15.1钢条切割、LCR 126. 斐波那契数/习题15.1-5、53. 最大子数组和

本文主要是介绍代码随想录算法训练营第三十一天丨15.1钢条切割、LCR 126. 斐波那契数/习题15.1-5、53. 最大子数组和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 15.1钢条切割

假设你有一根长度为n英寸的钢条和一个价格表,表中列出了不同长度的钢条的售价。你可以选择不同的方式切割这根钢条,然后将切割后的各段钢条按照价格表出售。目标是确定如何切割钢条以使得销售收益最大化。

问题的输入是一个价格表P[i],其中i=1,2,...,n,表示长度为i英寸的钢条的价格,以及钢条的总长度n。问题的输出是最大收益R[n]以及达到这个最大收益时各段钢条的长度。

解决这个问题的动态规划方法涉及将问题分解为更小的子问题,然后逐步构建解决原问题的方法。具体来说,动态规划算法会计算出对于每个长度i(1 <= i <= n),切割钢条所能得到的最大收益R[i]。这是通过比较不切割钢条(即直接出售整根钢条)和所有可能的切割方案(即将钢条切割为两部分,并递归地计算这两部分的最大收益)的收益来实现的。

算法的关键是避免重复计算相同子问题的解,这通常通过两种方式实现:

  1. 自顶向下的备忘录方法:这种方法首先尝试解决最大规模的问题,即求R[n],并在递归过程中,将所有小于n的R[i]的值存储在一个数组中,以避免重复计算。
  2. 自底向上的方法:这种方法从最小的子问题开始,即R[1],然后逐步计算所有R[i]直到R[n]。这种方法利用了子问题的解依赖于更小的子问题的解这一事实,通过迭代计算而不是递归来避免重复计算。

自顶向下的递归方法:

def cut_rod(p, n):if n == 0:return 0q = -float('inf')for i in range(1, n + 1):q = max(q, p[i] + cut_rod(p, n - i))return q

带备忘的自顶向下方法:

def memoized_cut_rod(p, n):# 初始化备忘录,所有值设为 None 表示未计算r = [None] * (n + 1)def cut_rod_aux(n):"""辅助递归函数,使用备忘录避免重复计算。:param n: 当前考虑的钢条长度。:return: 长度为 n 的钢条的最大收益。"""if r[n] is not None:return r[n]if n == 0:q = 0else:q = -float('inf')for i in range(1, n + 1):q = max(q, p[i] + cut_rod_aux(n - i))r[n] = qreturn qreturn cut_rod_aux(n)

自底向上的方法:

def bottom_up_cut_rod(p, n):# 初始化收益数组r,r[i] 存储长度为 i 的钢条的最大收益r = [0] * (n + 1)# 从最小子问题开始,逐步计算所有长度的最大收益for j in range(1, n + 1):q = -float('inf')# 对于每个长度j,尝试所有可能的第一段切割长度ifor i in range(1, j + 1):q = max(q, p[i] + r[j - i])r[j] = qreturn r[n]

LCR 126. 斐波那契数/习题15.1-5

入门级别的动态规划题目。

类似钢条切割,使用dp数组:

class Solution:def fib(self, n: int) -> int:if n == 0: return 0r = [0] * (n + 1)r[1] = 1for i in range(2, n + 1):r[i] = r[i - 1] + r[i - 2]return r[n] % 1000000007

空间复杂度是O(1)解法:

def fib(n):"""计算斐波那契数列的第n个数,使用动态规划(自底向上)。:param n: 斐波那契数列的索引:return: 第n个斐波那契数"""if n <= 1:return n# 初始化存储前两个斐波那契数的变量prev, curr = 0, 1for i in range(2, n + 1):prev, curr = curr, prev + currreturn curr

53. 最大子数组和

class Solution:def maxSubArray(self, nums: List[int]) -> int:current_max, global_max = nums[0], nums[0]for num in nums[1:]:current_max = max(num, current_max + num)global_max = max(current_max, global_max)return global_max

好像懂了,又好像没懂,以后系统刷到动态规划再说。

这篇关于代码随想录算法训练营第三十一天丨15.1钢条切割、LCR 126. 斐波那契数/习题15.1-5、53. 最大子数组和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697174

相关文章

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.