博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Maximum Subarray III
阅读量:6078 次
发布时间:2019-06-20

本文共 1857 字,大约阅读时间需要 6 分钟。

Given an array of integers and a number k, find k non-overlapping subarrays which have the largest sum.

The number in each subarray should be contiguous.

Return the largest sum.

Notice

The subarray should contain at least one number

Given [-1,4,-2,3,-2,3], k=2, return 8

这是一题划分类型的题目, 划分类型的题目只关心划分位,而不关心区间里面的内容.针对这题来说,我们只划分数组,并不是划分的区间内的所有数字形成的子数组就是我们在这个划分中要找的,可能是子子数组, 和区间型DP(,)形成了比较大的区别.这点需要注意. 也是划分类DP这种特点, 导致我们直接用类似区间型DP的定义方式,复杂度会很高,子子数组怎么复杂度很高.

所以此类题目一个比较好的解法是采用local, global双状态. local保存当前位置为结尾的局部最优状态, global保存全局最优状态.

如果采用传统解法:

state: f[i][j]表示前i个元素选了j次子数组,能够取得的最大值

function: f[i][j] = max{f[x][j-1] + subarray(x+1, i)} {x=0->i-1}

answer: f[n][k]

intialize: f[i][0] = 0, f[0][i] = -MAXINT (i>0)
其中转换状态中的subarray(x+1,i)需要求 x+1至i位置中的和最大的子数组.这个复杂度比较高.需要提前求出来,本身又是一个O(n^2)的DP问题,总体的复杂度为O(kn^2).
如果采用local, global的方法:
state: local[i][j]定义为前i个元素中取j个子数组, 其中第i个元素一定会被取到的最大和.
         global[i][j]定义为前i个元素取j个子数组,第i个元素不管取不取的最大值, 显然 global 是一个全局最优值.
复杂度为O(nk).
class Solution:    """    @param nums: A list of integers    @param k: An integer denote to find k non-overlapping subarrays    @return: An integer denote the sum of max k non-overlapping subarrays    """    def maxSubArray(self, nums, k):        if not nums or not k:            return 0        #local[i][j] the beginning  ith elements forms j subarray        locals = [[-sys.maxint] * (k+1) for i in xrange(len(nums)+1)]        globals = [[-sys.maxint] * (k+1) for i in xrange(len(nums)+1)]        for i in xrange(len(nums)+1):            locals[i][0] = 0            globals[i][0] = 0        for i in xrange(1,len(nums)+1):            for j in xrange(1, min(i,k)+1):                locals[i][j] = max(locals[i-1][j], globals[i-1][j-1]) + nums[i-1]                globals[i][j] = max(locals[i][j], globals[i-1][j])                return globals[len(nums)][k]

 

转载于:https://www.cnblogs.com/sherylwang/p/5635665.html

你可能感兴趣的文章
数组扩展方法之求和
查看>>
astah-professional-7_2_0安装
查看>>
函数是对象-有属性有方法
查看>>
uva 10107 - What is the Median?
查看>>
Linux下基本栈溢出攻击【转】
查看>>
c# 连等算式都在做什么
查看>>
使用c:forEach 控制5个换行
查看>>
java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试...
查看>>
使用ansible工具部署ceph
查看>>
linux系列博文---->深入理解linux启动运行原理(一)
查看>>
Android反编译(一) 之反编译JAVA源码
查看>>
结合当前公司发展情况,技术团队情况,设计一个适合的技术团队绩效考核机制...
查看>>
python-45: opener 的使用
查看>>
cad图纸转换完成的pdf格式模糊应该如何操作?
查看>>
Struts2与Struts1区别
查看>>
网站内容禁止复制解决办法
查看>>
Qt多线程
查看>>
我的友情链接
查看>>
想说一点东西。。。。
查看>>
css知多少(8)——float上篇
查看>>