子数组之和的最大值(二维) python

解法 1

利用二维前缀和求子数组之和的最大值,时间复杂为O(N^{2}*M^{2})

# 参考二维前缀和 https://blog.csdn.net/justidle/article/details/103754960
n = int(input())
nums = []
sum = [[0] * (n + 1) for _ in range(n + 1)]
for i in range(n):
    nums.append(list(input().split(' ')))
# 初始化
for i in range(1, n + 1):
    for j in range(1, n + 1):
        sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + int(nums[i - 1][j - 1])

maxinum = -2**31
for i_min in range(1,n+1):
    for i_max in range(i_min,n+1):
        for j_min in range(1,n+1):
            for j_max in range(j_min,n+1):
                maxinum = max(maxinum, sum[i_max][j_max] - sum[i_min - 1][j_max] - sum[i_max][j_min - 1] + sum[i_min - 1][j_min - 1])
print(maxinum)

解法 2

将问题从二维转化为一维。假设已经确定了矩阵的上下边界,比如说知道了矩阵区域的上下边界分别是第a行和第c行。那么就可以每一列的第a行和第c行之间的元素看作一个整体。那么就可转化为求BC[1],...,BC[M]中的和最大的一段。该时间复杂度为O(N*M*min(N,M))。

nums = [[1,2,3,-4],[1,2,3,4],[-1,2,3,4],[1,2,3,4]]
n,m = len(nums), len(nums[0])
def BC(a,c,j):#表示第a行和第C行之间的第j列的和
    sum = 0
    for i in range(a,c+1):
        sum += nums[i][j]
    return sum
maxinum = -2**31
for a in range(n):
    for c in range(a,n):
        Start = BC(a,c,m-1)
        All = BC(a,c,m-1)
        for i in range(m-2,-1,-1):
            if Start<0:
                Start = 0
            Start += BC(a,c,i)
            if Start>All:
                All = Start
        if All > maxinum:
            maxinum = All
print(maxinum)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值