题解 | 最大子矩阵

#include <bits/stdc++.h>
using namespace std;

int maxSubmatrixSum(vector<vector<int>>& matrix) {
    if (matrix.empty() || matrix[0].empty()) return 0;

    int rows = matrix.size();
    int cols = matrix[0].size();
    int maxSum = INT_MIN;

    // 辅助数组用于存储每一列的和
    vector<int> helper(rows, 0);

    // 遍历所有可能的列范围
    for (int left = 0; left < cols; ++left) {
        // 清零辅助数组
        fill(helper.begin(), helper.end(), 0);

        for (int right = left; right < cols; ++right) {
            // 增加当前列到辅助数组
            for (int i = 0; i < rows; ++i) {
                helper[i] += matrix[i][right];
            }

            // 在辅助数组上应用Kadane算法
            int currentSum = 0, localMax = INT_MIN;
            for (int i = 0; i < rows; ++i) {
                currentSum = max(helper[i], currentSum + helper[i]);
                localMax = max(localMax, currentSum);
            }

            maxSum = max(maxSum, localMax);
        }
    }

    return maxSum;
}

int main(){
    int n;
    while(cin>>n){
        vector<vector<int>> matrix(n,vector<int>(n));//初始化一个二维vector,内部不需要命名
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cin>>matrix[i][j];
            }
        }
        cout<<maxSubmatrixSum(matrix)<<endl;
    }
}

这是抄的大佬的,正在研究二维dp,感觉这个问题有点难

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务