参考书选择
我选择的是 [代码大全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
代码二,已测试过。