题解 | #最大子矩阵#

最大子矩阵

https://www.nowcoder.com/practice/a5a0b05f0505406ca837a3a76a5419b3

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//  知识点:前缀和 和 动态规划
int main() {
    int n;
    cin >> n;
    int nums[n + 1][n + 1], dp[n + 1][n + 1];
    memset(nums, 0, sizeof(nums));    // 一定要初始化!!!,否则会出错
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> nums[i][j];
            dp[i][j] = dp[i - 1][j] + nums[i][j];  // dp[i][j] 统计j列前i个nums的总和
        }
    }
    int ans = INT_MIN;    // ans 初始化为INT_MIN,保证有正确输出
    for (int i1 = 1; i1 <= n; i1++) {
        for (int i2 = i1; i2 <= n; i2++) {
            int sum[n + 1];
            memset(sum, 0, sizeof(sum));
            for (int j = 1; j <= n; j++) {
                int temp = dp[i2][j] - dp[i1 - 1][j];    // temp为j列[i1,i2]的和
                sum[j] = max(sum[j - 1] + temp, temp);   // sum为动态规划求最大矩阵
                ans = max(ans, sum[j]);    // 比较各矩阵大小 
            }
        }
    }
    cout << ans << endl;     // 输出答案
    return 0;
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务