最大子数组的线性时间求解问题

本文探讨如何使用动态规划在线性时间内解决最大子数组问题。通过分析算法导论中的思路,提出了一个非递归的线性时间算法。首先定义dp数组,并通过递推方程实现状态转移。接着,介绍了如何通过滚动数组优化空间复杂度。最后,简单提及了贪心算法在这个问题上的应用,虽然与dp类似,但贪心需要证明其正确性。
摘要由CSDN通过智能技术生成

之前有一个博客说的是使用分治的方式处理问题,但是我们可以看到实际上是将问题复杂化了。
链接:最大子数组问题

动态规划

dp说白了就是一个个的不断尝试,来找到问题的最优解,那么动态规划就应该有一个状态转移方程,我们来看看这道题用动态规划能不能解决?

算法导论还是很良心的,至少给了我们以下的思路:

使用如下思想为最大子数组问题设计一个非递归的、线性时间的算法。从数组的左边界开始,从左至右处理,记录到目前为止已经处理过的最大子数组。若已知A[1…j]的最大子数组,基于如下性质将解扩展为A[1…j+1]的最大子数组:A[1…j+1]的最大子数组要么是A[1…j]的最大子数组,要么是某个子数组A[i…j+1]> (1≤i≤j+1)。在已知A[1…j]的最大子数组的情况下,可以在线性时间内找出形如A[i…j+1]的最大子数组。

先看看这句话什么意思吧。
我们已经有了一个[1……j]的最大子数组,那么在此基础上我们就可以求出A[1……j+1]的最大子数组,只可能有两种情况:还是原来的,或者是舍弃前面的一部分,A[i……j+1]。(这部分比较直观)
然后就是线性时间求[i……j+1],这个就是一个个的遍历找到i。

如果我们给出的dp数组的定义是这样的dp[i] = A[1……i]最大子数组的值,那么写递推方程会变成这样:

dp[j+1] = max{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值