2058 Problem E 最大子矩陣
阿新 • • 發佈:2018-12-04
問題 E: 最大子矩陣
時間限制: 1 Sec 記憶體限制: 32 MB
提交: 61 解決: 25
[提交][狀態][討論版][命題人:外部匯入]
題目描述
已知矩陣的大小定義為矩陣中所有元素的和。給定一個矩陣,你的任務是找到最大的非空(大小至少是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]。
輸出
測試資料可能有多組,對於每組測試資料,輸出最大子矩陣的大小。
樣例輸入
1
27
3
-40 29 -16
38 18 22
24 -35 5
樣例輸出
27
78
#include<iostream> #include<algorithm> using namespace std; //最大連續子序列和的二維問題,動態規劃解決 //因為每一行的最大子矩陣不確定由哪幾列構成,dp二維陣列寫法不需要且不可行 int main() { int N; while (cin >> N) { int sum[110][110] = { 0 }, ans = -1e9; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { cin >> sum[i][j];//sum[i][j]存放原矩陣第i行前j列的和 sum[i][j] += sum[i][j - 1];//即轉化為對應的1維情況,對每一列處理 } } //列舉前k行,第i+1列至第j列(i,j]的和,得出最大值ans for (int i = 0; i <= N; i++) { for (int j = i + 1; j <= N; j++) { int subsum = 0; for (int k = 1; k <= N; k++) { // 動態規劃思想,subSum<0將會減少總和,所以此時將其置0 if (subsum < 0) subsum = 0; subsum += sum[k][j] - sum[k][i]; ans = max(ans, subsum); } } } cout << ans << endl; } return 0; }
#include<iostream> #include<algorithm> using namespace std; //嘗試了一下使用dp二維陣列,不需要且不可行 //因為每一行的最大子矩陣不確定由哪幾列構成 int main() { int N; while (cin >> N) { int a[110][110] = { 0 }, ans = 1e-9; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { cin >> a[i][j]; a[i][j] += a[i][j - 1]; } } for (int i = 0; i < N; i++) { for (int j = i + 1; j <= N; j++) { int subsum = 0; for (int k = 1; k <= N; k++) { if (subsum < 0) subsum = 0; subsum += a[k][j] - a[k][i]; ans = max(subsum, ans); } } } cout << ans << endl; } return 0; }