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

 

代码二,已测试过。

posted on 2013-09-20 11:12  Yuzuka  阅读(181)  评论(0)    收藏  举报

导航