work1

二维矩阵最大子矩阵和算法

参考书选择

我选择的是 [代码大全2英文版(完整清晰版)].chm

问题分析

对于一维的情况,经典的方式是使用前缀数组s[i]表示a[0]至a[i]的加和,区间最大和若是a[i]至a[j]则等价于s[j]-s[i-1]。以j结尾的区间的最大和必然等于s[j]减去j之前的s中的最小值,而这这个位置是单调递增的。因此时间复杂度为O(n)。

那么我们进入二维的。

 

同理:

设s[x][y]为以坐标(0,0)为左上角,(x,y)为右下角的点所形成的的矩形的加和。以(a,b)(x,y)构成的矩形的值为,(s[x][y] - s[a-1][y])-(s[x][b-1] - s[a-1][b-1]),不具备一维时的单调性,只能通过在此枚举一行。时间复杂度为O(m*n*n),无法达到最好的O(m*n)。

 

f = open("num.txt", "r")

a = []#数组

for line in f.readlines():

      a.append(int(line))

n = len(a)

ss = 0

s = []#前缀数组

for i in range(0,n):

      ss += a[i]

      s.append(ss)

small = 65535

big = -65535

for i in range(0,n):

      if s[i] < small:

           small = s[i]

      if s[i] - small > big:

           big = s[i] - small

print big

 

x=raw_input("row number\n")

y=raw_input("line number\n")

f=open("num.txt","r")

num=[]

for i in range(0,int(x)):

    for j in range(0,int(y)):

        l=f.readline()

        l=l.strip('\n').split(",")

        num.append(l)

temp=[0]*int(x)

s=0

a=-1000000

for i in range(0,int(y1)):

    for j in range(i,int(y1)):

        for k in range(0,int(x)):

            temp[k]+=int(num[j][k])

            if(s+temp[k]<temp[k]):

                s=0

            s+=temp[k]

            if(a<s):

                a=s

        s=0

    s=0

    temp=[0]*int(x)

print a

 

代码二,已测试过。

转载于:https://www.cnblogs.com/yuzuka/p/3330260.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值