題目大意:給定乙個矩陣,求出它的子矩陣中元素之和的最大值
題目分析:這道題明顯是用 動態規劃來做。我們可以先分析一維陣列的情況,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...