藍橋杯 最大子陣 動態規劃

2021-08-17 11:21:48 字數 1260 閱讀 3397

題目大意:給定乙個矩陣,求出它的子矩陣中元素之和的最大值

題目分析:這道題明顯是用 動態規劃來做。我們可以先分析一維陣列的情況,num = ,考慮類似這樣的陣列,要求出它的最長連續子串行和的最大值。我們從左往右掃瞄,用dp[i]表示以第i個元素為末尾元素的連續子串行和的最大值。也就是第i個元素一定要包括在內。那麼,我們可以得到dp[i] = max(dp[i-1]+num[i],num[i]).  也就是說,如果dp[i-1]大於0,那麼dp[i]就等於dp[i-1]再加上num[i];若dp[i-1]<=0, 那麼dp[i] = num[i]. 因為前面的值是負值,加上dp[i-1]只會使得dp[i]變小,而我要求的是包含num[i]的最大值。

回到該問題上,因為這裡由一維陣列變成了矩陣,所以我們盡量把矩陣的最大子陣問題轉化為一維的情況。假設矩陣是2*m的大小,如下圖所示:

a11a12

a13a14

a15a16

a17a18

a19a21

a22a23

a24a25

a26a27

a28a29

我們要求該矩陣的最大子陣,我們可以怎麼求? 我們會先處理第一行元素的最大連續子串行和、再處理第二行最大連續子串行和,這時最大子陣是1*m的形式,然後還要考慮2*m的形式,比如可能a14,a24,a15,  a25可以成為最大子陣。 這種情況我們可以採用壓縮法,即把每列元素累加起來,變成求 a11+a21, a12+a22, a13+a23, a14+a24, a15+a25,....a19+a29 這個序列的最大連續子串行的和。

如果我們處理3*m的情況,如圖所示:

a11a12

...a21

a22...

a31a32

...我們可以依次處理第一行、第一二行壓縮之後、第一二三行壓縮之後、第二行、第二三行壓縮後、第三行的一維陣列的最大連續子串行和,它們的最大值就是矩陣的最大子陣之和。

當矩陣變成n*m時,兩層迴圈來控制要壓縮的第i行和第j行之間的元素,然後用o(n)的時間來求出一維陣列的最大連續子串行和,總時間複雜度是o(n^3)

**展示:

#include #include #include using namespace std;

int main()

}int result = num[0][0]; //先將其設為第乙個數

for(int i=0;iresult)

result = dp[u];}}

}cout

}

藍橋杯 歷屆試題 最大子陣(動態規劃)

給定乙個n m的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。其中,a的子矩陣指在a中行和列均連續的一塊。樣例說明 取最後一列,和為10。資料規模和約定 對於100 的資料,1 n,m 500,a中每個元素的絕對值不超過5000。輸入輸入的第一行包含兩個整數n,m,分別表示矩陣a的行數...

藍橋杯 最大子陣

2.類似的題 zoj problem set 1074 給定乙個n m的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。其中,a的子矩陣指在a中行和列均連續的一塊。樣例說明 取最後一列,和為10。資料規模和約定 對於100 的資料,1 n,m 500,a中每個元素的絕對值不超過5000。...

藍橋杯 最大子陣

給定乙個nxm的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。其中,a的子矩陣指在a中行和列均連續的一塊。輸入格式 輸入的第一行包含兩個整數n,m,分別表示矩陣a的行數和列數。接下來n行,每行m個整數,表示矩陣a。輸出格式 輸出一行,包含乙個整數,表示a中最大的子矩陣中的元素和。3 3...