題目描述
有乙個包含正數和負數的二維陣列。乙個子矩陣是指在該二維陣列裡,任意相鄰的下標是1*1或更大的子陣列。乙個子矩陣的和是指該子矩陣中所有元素的和。本題中,把具有最大和的子矩陣稱為最大子矩陣。
例如:0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
這個陣列的最大子矩陣為:
9 2-4 1
-1 8
其和為15。
輸入輸入包含多組測試資料。每組輸入的第一行是乙個正整數n(1<=n<=100),表示二維方陣的大小。接下來n行每行輸入n個整數,表示陣列元素,範圍為[-127,127]。
輸出輸出最大子陣和。
思路:我們假設所求n*n的矩陣的最大子矩陣是從i列到j列,q行到p行,如下圖所示(假設下標從1開始)
a[1][1] a[1][2] ······ a[1][i] ······ a[1][j] ······ a[1][n]
a[2][1] a[2][2] ······ a[2][i] ······ a[2][j] ······ a[2][n]
a[q][1] a[q][2] ······ a[q][i] ······ a[q][j] ······ a[q][n]
a[p][1] a[p][2] ······ a[p][i] ······ a[p][j] ······ a[p][n]
a[n][1] a[n][2] ······ a[n][i] ······ a[n][j] ······ a[n][n]
最大子矩陣就是圖示紅色部分,如果把最大子矩陣同列的加起來,我們可以得到乙個一維陣列 ,現在我們可以看出,這其實就是乙個一維陣列的最大子段問題。如果把二維陣列看成是縱向的一維陣列和橫向的一維陣列,那問題不就迎刃而解了嗎?把二維轉換成了我們剛剛解決了的問題。
**
1 #include 2 #include 3 using namespace std;
4 5 int maxsub(int a,int n)
6 17 return max;
18 }
19 20 int main()
21 40 }
41 cout<42 }
43 }
最大子段和 最大子矩陣和
給出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 擁有最大和的子矩陣為 ...