欢迎光临
我们一直在努力

【C++算法入门】动态规划—最大子数组和

一  原题复现

现有一个长度为N的数组,求连续的子数组中和最大的。

二 思路分析(本人语言能力有限,思路写的不甚清晰,可直接去看代码,其中也有精简的分析)

要求连续子数组中和最大的。我们可以利用暴力解法:利用两个循环求出每个连续子数组的和,再找到和最大,考虑其时间复杂度O(n²),极易超时。如何优化呢?又是最值,容易想到动态规划。

既然是连续子数组,我们就需要不断去掉前面的“拖累”,并且判断是否需要继续向前延伸。举个例子说明:现有数组arr{1,-2,-1,3,-1,2}。从元素1开始,子数组和就是1,继续求和1-2=-1。思考,是否需要将子数组第一个元素向前推进呢?答案显然是不需要,因为此时-1>-2。继续求和-1-1=-2,此时显然就要换掉子数组的第一个元素了、继续-1+3=2,此时任然需要换掉子数组的第一个元素、继续3-1=2,这时我们就要判断子数组值不值延伸到元素-1,目前看来是不值得,但我们不妨继续往前延伸2+2=4,这是要大于我们之前所求的3。稍加思考,写出状态转移方程 dp= max {arr[i], dp+arr[i]},result=max{result,dp}。下面我便用C++对上述思路进行实现。

三  代码实现

本人能力有限,欢迎大家指正。码字不易,大家喜欢或者有帮助的可以点点赞点点关注,谢谢。

赞(0)
未经允许不得转载:171主机测评 » 【C++算法入门】动态规划—最大子数组和
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址