首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

HDU 1081 To The Max:二維最大子矩陣和與 Kadane 演算法擴展

     編輯:C++ 入門

題目大意

給定 N×N 矩陣(N ≤ 100),元素為整數(可正可負),求任意子矩陣(連續行、連續列)的最大元素和。

降維思想:二維 → 一維

  1. 枚舉上邊界 top 從 0 到 N-1。
  2. 初始化一維數組 colSum[N] = {0}。
  3. 枚舉下邊界 bottom 從 top 到 N-1,累加第 bottom 行到 colSum:
    for (int c=0; c
  4. 對當前 colSum 求最大子數組和(Kadane),更新全局答案。

原理:固定上下邊界後,子矩陣列和即為 colSum 的連續子段和。

Kadane 演算法(最大子數組和)


int maxSubArray(const vector& a) {
    int maxEndingHere = a[0], maxSoFar = a[0];
    for (size_t i=1; i

全負數組也能正確返回最大元素(而非 0)。

完整代碼 (C++)


#include <bits/stdc++.h>
using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N;
    while (cin >> N) {
        vector> mat(N, vector(N));
        for (int i=0; i> mat[i][j];
        int ans = INT_MIN;
        vector colSum(N);
        for (int top=0; top

複雜度分析

  • 時間:O(N^3) = 100^3 = 1e6,極快
  • 空間:O(N^2) 存矩陣 + O(N) 輔助數組

優化變體

  • 若矩陣稀疏,可預處理每行非零元素,累加時只遍歷非零列。
  • 輸出子矩陣座標:Kadane 過程記錄 left/right,外層記錄 top/bottom。
  • 三維擴展:O(N^4) 或 O(N^3 log N) 配合分治。

總結

HDU 1081 是二維最大子矩陣和的經典模板題。核心技巧:枚舉上下邊界壓縮列,轉化為一維最大子數組和。Kadane 演算法 O(N) 求解一維問題,整體 O(N^3) 完美適用 N≤100。此降維思想廣泛應用於圖像處理(最大亮度區域)、金融(多資產最大收益窗口)、基因組學(最大得分片段)等領域。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved