乙個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 擁有最大和的子矩陣為 ...