最大連續子矩陣累加和

2021-08-21 10:23:45 字數 1667 閱讀 3277

在此之前我們先做個鋪墊:

題目大意:給定n個數,求這些數的某個連續子串行的累加和,保證這個連續子串行的累加和最大

。舉個栗子(俗稱樣例):

輸入:

7-34

9-2-58

-3

輸出:14樣例解釋:最大的呢是:4+9+(-2)+(-5)+8

由此可見,無法將加上當前數的和與當前最大值進行對比來確定答案,

雖然有負數,但之後可能有更大的數,即可以彌補加上的負數,還可以增大「最大值」

但是,剛開始的幾個負數是沒必要的

#includeusing namespace std;  

int n;

int ans=-20200;//因為可能最後的最大值也可能是負數,因此我們不妨將ans的值賦得更小一些

int x;

int main()

cout<

接下來進入正題:

給定乙個正整數n( n<=500),然後輸入乙個n × 

×

n矩陣。求矩陣中最大加權矩形,即矩陣的每乙個元素都有一權值,權值定義在整數集上。從中找一矩形,矩形大小無限制,是其中包含的所有元素的和最大 。矩陣的每個元素屬於[-1100,1100]

例:

0  –2    –7   0       在左下角: 9  2

9    2    –6   2            -4  1  

-4   1   –4    1              -1  8

-1   8     0  –2           和為15

在這題中,需要運用到上一題的思路,只是對矩陣的操作就有點麻煩了。暴力?不行。

這是經典的問題,我們需要將此降維,也就是說要把它包裝一下,壓成能用上題的操作解決的問題。

我們要用乙個sum陣列在輸入的時候將當前這一行的各個矩陣的和記錄下來:

for(int i=1;i<=n;i++) 

for(int j=1;j<=n;j++)

最主要的還是之後的操作,我們用temp陣列來記錄第k行從i列到第j列的和 

來個圖:

剩下的,直接枚舉行數進行累加,並以第一題的方法來解就行

二話不說,上**:

#includeusing namespace std;

int n;

int a[1100][1010]={};

int ans=-101001;

int sum[1100][1010]={};

int temp[1100]={};

void work()

} cout<>n;

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

work();

return 0;

}

子矩陣最大累加和

問題描述如下 給定乙個矩陣matrix,其中的值有正 有負 有0,返回子矩陣的最大累加和。藍橋備戰資料 演算法很美 chapter4 多維陣列和矩陣 先想到了一維陣列的求子陣列最大累加和的題目,時間複雜度為o n 利用這種思維來處理這道題目。第一列第二列 第三列最大累加和 第一行 1 1 1 1第一...

子矩陣的最大累加和

題目 給定乙個矩陣matrix,其中的值有正 有負 有零,返回子矩陣的最大累加和。例如矩陣matrix為 90 48 78 64 40 64 81 7 66 其中,最大累加和的子矩陣為 48 78 40 64 7 66 所以返回子矩陣的最大累加和為209。解析 最簡單也最容易想到的方法是求出矩陣中的...

子矩陣的最大累加和

一 題目要求 給定乙個矩陣matrix,其中的值有正有負,有0,返回子矩陣的最大累加和,例如,矩陣matrix為 90 48 78 64 40 64 81 07 66 其中,最大累加和的子矩陣為 48 78 40 64 7 66 所以返回累加和209 二 解題思路 將矩陣matrix n n 的每一...