算法基础——动态规划之最大子数组问题

本文介绍了如何使用动态规划解决最大子数组问题。通过分析问题结构,找到最优子结构性质,构造递推式,并利用Golang进行实现,将时间复杂度从O(nlogn)降至O(n)。
摘要由CSDN通过智能技术生成
  • 问题描述
    在这里插入图片描述
    - 分而治之的解决方案

    在分治算法中,已经学习过最大子数组问题。使用分治的方法:将大数组arr分为两个小数组arr_left和arr_right,则求解arr的最大子数组和等价于

    在arr_left的最大子数组和、arr_right的最大子数组和、跨中点的最大子数组和中找一个最大的,即为arr的最大子数组和。

    采用分治算法解决该问题,Golang实现在前面分治的博客里写过,其时间复杂度为O(nlogn),而使用dp的方法可以使复杂度降低至O(n)

  • DP的解决方案

    1)分析问题结构: dp的第一步为分析问题结构,找到该问题的最佳子结构性质:对n个元素的数组arr[n]求解最大子数组和maxSum(n), 首先去找 maxSum(n)maxSum(n-1) 的关系。

    假设我们已经知道前n-1个元素的最大子数组和 maxSum(n-1), 设前n个元素中以第n元素结尾的最大子数组和为 P(n) , 则

    maxSum(n) = max{ maxSum(n-1), P(n) }

    继续观察 P(n)P(n-1) 的关系: 若以第n-1个元素结尾的最大子数组和 P(n-1) 加上第n个元素的和大于第n个元素(即P(n-1)>0),那么以第n个元素结尾的最大子数组和为 P(n) = P(n-1) + arr[n],否则 P(n) 就等于arrr[n] 第n个元素本身, 即:

    P(n) = max{ P(n-1)+arr[n], arr[n] }

    我们已经找到了maxSum(n)和maxSum(n-1)子问题的关系,这就是最大子数组和问题的最优子结构性质。

    2)构造递推式: 我们通过分析最优子结构性质。已经得到了dp的递推式:

    P(n) = max{ P(n-1)+arr[n], arr[n] }
    maxSum(n) = max{ maxSum(n-1), P(n) }

    3)初始化数组,自底向上求解: 构造两个一维数组 maxSumP ; P[i]: 数组前i的元素中包含元素i的最大子数组和; maxSum[i]: 数组前i个元素中的最大子数组和。

    设没有元素的数组最大子数组和为负无穷以便于求解,即初始化P[0] 和

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值