N×N 矩陣(N≤100),尋找任意子矩陣(連續行、連續列)使元素和最大。輸出最大和。
sum[col][row] = 第 col 列前 row 行和。top (1~n) 和下邊界 bottom (top~n)。sum[col][bottom] - sum[col][top-1],得到一維數組。#include <cstdio>
#include <climits>
#include <algorithm>
using namespace std;
const int MAXN = 105;
int a[MAXN][MAXN];
int col_sum[MAXN][MAXN]; // col_sum[c][r] = column c, rows 1..r sum
int main() {
int n;
while (~scanf("%d", &n)) {
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
scanf("%d", &a[i][j]);
// 列前綴和
for (int c=1;c<=n;++c) {
col_sum[c][0] = 0;
for (int r=1;r<=n;++r)
col_sum[c][r] = col_sum[c][r-1] + a[r][c];
}
int ans = INT_MIN;
// 枚舉上下行
for (int top=1; top<=n; ++top) {
for (int bottom=top; bottom<=n; ++bottom) {
int cur = 0, best = INT_MIN;
for (int c=1; c<=n; ++c) {
int val = col_sum[c][bottom] - col_sum[c][top-1];
cur = max(val, cur + val); // Kadane
best = max(best, cur);
}
ans = max(ans, best);
}
}
printf("%d\n", ans);
}
return 0;
}
cur = max(val, cur+val) 同時處理負數情況。ans = INT_MIN 保證全負數矩陣也能正確取最大值(最小負數)。POJ 1050 是「二維最大子矩陣和」的經典入門題。核心技巧:
此 O(n³) 算法是二維最大子陣列和的標準解法,N≤100 時最優。掌握此模板,可解決所有「連續子矩陣極值」問題。