HDU 1081「最大子矩陣」是經典的二維動態規劃問題。其核心思想是將二維矩陣問題轉化為多個一維最大連續子序列和問題,通過「枚舉行 + 列向累加 + 一維 DP」的策略,在 O(n³) 時間複雜度內求解。
mark[k],代表該列在行區間內的總和。mark 數組應用 Kadane 算法,求出最大連續子段和,即為以行 i 到 j 為上下邊界的最大子矩陣和。int linemax() { // 一維最大連續子序列和 (Kadane)
int x = 0, Max = INF;
for (int i = 1; i <= n; i++) {
if (x > 0) x += mark[i];
else x = mark[i];
if (x > Max) Max = x;
}
return Max;
}
int rowmax() { // 枚舉行區間
int Max = INF;
for (int i = 1; i <= n; i++) { // 起始行
memset(mark, 0, sizeof(mark));
for (int j = i; j <= n; j++) { // 終止行
for (int k = 1; k <= n; k++)
mark[k] += num[j][k]; // 列向累加
int x = linemax();
if (x > Max) Max = x;
}
}
return Max;
}
mark 數組原地累加,避免重複計算列和;Kadane 算法單次掃描即可得出一維最大值。輸入多組測試用例,每組先給 n,再給 n×n 矩陣,以 EOF 結束。程序對每組輸出最大子矩陣和。