貪心 最大子矩陣

2021-07-24 18:07:46 字數 1460 閱讀 6436

最大子矩陣

總時間限制: 1000ms 記憶體限制: 65536kb

描述 已知矩陣的大小定義為矩陣中所有元素的和。給定乙個矩陣,你的任務是找到最大的非空(大小至少是1 * 1)子矩陣。

比如,如下4 * 4的矩陣

0 -2 -7 0

9 2 -6 2

-4 1 -4 1

-1 8 0 -2

的最大子矩陣是

9 2

-4 1

-1 8

這個子矩陣的大小是15。

輸入 輸入是乙個n * n的矩陣。輸入的第一行給出n (0 < n <= 100)。再後面的若干行中,依次(首先從左到右給出第一行的n個整數,再從左到右給出第二行的n個整數……)給出矩陣中的n2個整數,整數之間由空白字元分隔(空格或者空行)。已知矩陣中整數的範圍都在[-127, 127]。

輸出 輸出最大子矩陣的大小。

樣例輸入

4 0 -2 -7 0

9 2 -6 2

-4 1 -4 1

-1 8 0 -2

樣例輸出

15貪心只是一種演算法,而一道題往往要用到多種演算法,比如這道題還需要用到列舉,因此,不要侷限於找最大的某乙個點,要先枚舉子矩陣,再來判斷子矩陣的最大值。

對於這道題而言,首先是列舉的子矩陣左上角,然後枚舉子矩陣的高度,最後通過貪心來枚舉子矩陣左上角的列數和子矩陣的寬度。

這道題的貪心策略實際上為:求乙個陣列中連續元素的和的最大值

參考**

#include 

#include

#include

#include

#include

#include

using

namespace

std;

int a;

int rect[105][105];

int arrays[105]; //儲存列的和的陣列

//貪心:求陣列中連續的元素的和的最大值:如果已經累加的和大於0,肯定有助於和變大,就直接加上;如果小於等於0,那不如不加。

int sum()

return max1;

}int main()

}int res = rect[0][0]; //用於儲存結果的變數,因為有可能是負數,所以初始化為可能的結果之一,即某乙個子矩陣的值

//以下過程實際上是列舉

//i - 用於列舉的變數,不是當前行數,而是起始行數, j - 當前行數, k - 列數

for (int i = 0; i < a; i++) //相當於在枚舉子矩陣左上角的行數

int temp = sum(); //判斷當前的資料 - 相當於在枚舉子矩陣左上角的列數及子矩陣的寬度

if (temp > res)}}

printf("%d", res);

return

0;}

最大子矩陣(貪心)

總時間限制 1000ms 記憶體限制 65536kb 描述 已知矩陣的大小定義為矩陣中所有元素的和。給定乙個矩陣,你的任務是找到最大的非空 大小至少是1 1 子矩陣。比如,如下4 4的矩陣 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 的最大子矩陣是 9 2 4 1 1 8 這個子...

最大子矩陣 字首和 貪心

給定乙個包含整數的二維矩陣,子矩形是位於整個陣列內的任何大小為1 1或更大的連續子陣列。矩形的總和是該矩形中所有元素的總和。在這個問題中,具有最大和的子矩形被稱為最大子矩形。例如,下列陣列 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 其最大子矩形為 9 2 4 1 1 8 它擁有...

最大子矩陣

描述 已知矩陣的大小定義為矩陣中所有元素的和。給定乙個矩陣,你的任務是找到最大的非空 大小至少是1 1 子矩陣。比如,如下4 4的矩陣 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 的最大子矩陣是 9 2 4 1 1 8 這個子矩陣的大小是15。輸入輸入是乙個n n的矩陣。輸入的第...