最大子矩陣和

2021-09-12 10:40:47 字數 1175 閱讀 6585

題目描述

有乙個包含正數和負數的二維陣列。乙個子矩陣是指在該二維陣列裡,任意相鄰的下標是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 擁有最大和的子矩陣為 ...