最大子矩陣和

2021-09-25 13:20:59 字數 3096 閱讀 4112

乙個n*m的矩陣,其中元素都為整數,求最大子矩陣的和

如果用窮舉法,子矩陣左上角的座標(i_1,i_2)有nm種可能,右下角座標(j_1,j_2)有nm種可能,遍歷矩陣內容求和複雜度為o(nm),因此窮舉的複雜度為o((nm)^3)

先回顧另乙個題:求最大子串行,有兩種方法

###動態規劃

defmaxsum

(nums)

: tmp =

sum= nums[0]

iflen

(nums)!=1

:#單個就直接輸出

for i in

range(1

,len

(nums)):

if tmp <=0:

#意味著增大的序列已經終止,從最大max到當前tmp的序列都是遞減,沒有意義,需要重新考慮

tmp = nums[i]

else

: tmp += nums[i]

sum=

max(tmp,

sum)

return

sum

分治:

def

leetcode

(s):

iflen

(s)==1:

return s[0]

; center =

len(s)//2

left = s[

:center]

right = s[center:

] left_max = leetcode(left)

right_max = leetcode(right)

c2left_max = left[-1

] c2l_temp =

0for i in left[::

-1]:

c2l_temp += i

if c2l_temp > c2left_max:

c2left_max = c2l_temp;

c2right_max = right[0]

c2r_temp =

0for j in right:

c2r_temp += j

if c2r_temp > c2right_max:

c2right_max = c2r_temp;

return

max(left_max,right_max,c2left_max+c2right_max)

這裡我們考慮將二維矩陣進行降維處理,通過確定的行範圍,將列範圍進行求和(行在變化過程中,對列的選取由最大子串行完成),壓縮為一維陣列,將問題轉換為求一維陣列最大子串行。

import sys

import numpy

defmaxsubarray

(array)

:# 最大子串行

rs = array[0]

tmp = rs;

n =len(array)

start =

0#最大子串行起始位置

end =

0if n !=1:

for i in

range(1

,n):

tmp += array[i]

;if tmp <=0:

tmp =

0 start = i +1;

if tmp > rs:

rs = tmp

end = i

#print(start,end)

return rs,start,end

defmaxsubmatrix

(matrix,n,m)

: rs =0;

rs_start =(0

,0)#最大子矩陣座標

rs_end =(0

,0)for i in

range

(n):

#遍歷起始行

tmp_sum =[0

for _ in

range

(m)]

# numpy.zeros(m)清零,每一列的和

for j in

range

(i,n)

:#結束行

for k in

range

(m):

#將每一列降維

tmp_sum[k]

+= matrix[j]

[k]#每一列求和

tmp_max,y1,y2 = maxsubarray(tmp_sum)

if(tmp_max > rs)

: rs_start =

(i,y1)

rs_end =

(j,y2)

rs = tmp_max;

return rs,rs_start,rs_end

if __name__ ==

"__main__"

: message = sys.stdin.readline(

).strip(

).split(

) n,m =

int(message[0]

),int(message[1]

);matrix =

# matrix = numpy.arange(n*m).reshape(n,m)

for i in

range

(n):

) nums = sys.stdin.readline(

).strip(

).split(

)for j in

range

(m):

matrix[i]

int(nums[j]))

print

(matrix)

print

(maxsubmatrix(matrix,n,m)

)

1.行範圍的選取o(nn)

2.對列求和進行降維處理o(m),這一步可以預先算好

3.降維後,求最大子串行o(m)

因此複雜度為o(nn*m)

最大子段和 最大子矩陣和

給出n個整數序列 可能為負數 組成的序列a1,a2,an,求該序列形如 的子段和的最大值。當所有整數均為負數時,定義最大子段和為0。多測試用例。每個測試用例佔2行 第一行是序列的個數n 0 n 10000 第二行是n個整數。為每個測試用例輸出一行結果 最大子段和。6 2 11 4 13 5 2 31...

最大子矩陣和

前言 今天花了很長時間,看了無數人寫的帖子,但是幾乎沒有人把這個問題一下子說得很清楚,所以,我把這個問題按照自己的思路寫出來,希望能夠把這個問題講清楚。問題 求乙個m n的矩陣的最大子矩陣和。比如在如下這個矩陣中 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 擁有最大和的子矩陣為 ...

最大子矩陣和

前言 今天花了很長時間,看了無數人寫的帖子,但是幾乎沒有人把這個問題一下子說得很清楚,所以,我把這個問題按照自己的思路寫出來,希望能夠把這個問題講清楚。問題 求乙個m n的矩陣的最大子矩陣和。比如在如下這個矩陣中 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 擁有最大和的子矩陣為 ...