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
總結
- 上一篇: php实现查询上传文件进度
- 下一篇: 查询宣讲会地址