lintcode练习 - 43. 最大子数组 III

43. 最大子数组 III

给定一个整数数组和一个整数 k,找出 k 个不重叠子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续的。

返回最大的和。

样例

给出数组 [-1,4,-2,3,-2,3] 以及 k = 2,返回 8

注意事项

子数组最少包含一个数

解题思路:

只能做到 O(nk) 时间。

两个数组分别记录包含当前值的本地最优解和全局最优解。local[i][j]代表从0到nums中第i个数字处,分成j个数组后,和的最大值,且必须包括第i个数字,这样可以排除第i个数组包含在前一个数组中的情况。global[i][j]代表从0到nums第i个数字处,分成j个数组后和的最大值。

mustTheLast[ i ][ j ] 表示前 i 个数中 j 个子数组的最大子数组和,且第 i 个数是第 j 个子数组的元素。

notTheLast[ i ][ j ] 表示前 i 个数中 j 个子数组的最大子数组和,且第 i 个数不一定是第 j 个子数组的元素。

二维数组动态规划的状态转移方程为:

local[i][j] = max(local[i - 1][j], global[i - 1][j - 1])  + nums[i - 1];

global[i][j] = max(global[i - 1][j], local[i][j]);

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):
        # write your code here
        n = len(nums)

        mustTheLast = [[-1e9 for i in range(k+1)] for j in range(n+1)]

        notTheLast = [[-1e9 for i in range(k+1)] for j in range(n+1)]

        mustTheLast[0][0] = 0

        notTheLast[0][0] = 0

        for i in range(1, n+1):

            mustTheLast[i][0] = 0

            notTheLast[i][0] = 0

            for j in range(1, k+1):

                mustTheLast[i][j] = max(notTheLast[i-1][j-1] + nums[i-1], mustTheLast[i-1][j] + nums[i-1])

                notTheLast[i][j] = max(mustTheLast[i][j], notTheLast[i-1][j])

        return notTheLast[n][k]
    '''
    #矩阵压缩
    def maxSubArray(self, nums, k):
        # write your code here
        n = len(nums)
        if n < k:
            return 0
        loc, glo = [0] * (1 + k), [0] * (1 + k)
        for i in range(1, n + 1):
            for j in range(k, 0, -1):
                if j > i:
                    continue
                elif j == i:
                    loc[j] = loc[j - 1] + nums[i - 1]
                    glo[j] = glo[j - 1] + nums[i - 1]
                else:
                    loc[j] = max(loc[j], glo[j - 1]) + nums[i - 1]
                    glo[j] = max(glo[j], loc[j])
        return glo[k]
    
        

 

你可能感兴趣的:(#,lintcode,#,算法,python,#,动态规划,#,lintcode练习笔记)