参考了其他大哥的思路,自己写的
基本思路是
1、求一维数组的最大子序列和
2、最大子矩阵有可能是1到n行,所以要遍历
3、为了遍历便捷性,增加一个辅助数组total[i][j] ,用来存放前第j列前i行的元素和

#include <stdio.h>

int fun(int* arr,int n);

int main(){
    int n = 0;
    scanf("%d",&n);
    int arr[n][n];
    int total[n][n];
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            //初始化辅助数组
            total[i][j] = 0;
        }
    }
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            scanf("%d",&arr[i][j]);
            //求辅助数组
            if(i == 0)
                total[i][j] = arr[i][j];
            else
                total[i][j] = total[i-1][j] + arr[i][j];
        }
    }
    
    //从一行到n行遍历
    int max = -999;
    int tmp = 0;
    int ass[n];
    for(int i = 0; i < n; i++){
        ass[i] = 0;
    }
    for(int i = 1; i <= n; i++){
        for(int j = i-1; j < n; j++){
            for(int k = 0; k < n; k++){
                if(j < i)
                    ass[k] = total[j][k];
                else
                    ass[k] = total[j][k] - total[j-i][k];
            }
            tmp = fun(ass,n);
            max = tmp > max ? tmp : max;
        }
    }
    printf("%d",max);
    return 0;
}

//一维数组求最大和
int fun(int* arr,int n){
    int max = 0;
    int prev = arr[0];
    max = prev;
    if(n == 1){
        return max;
    }
    for(int i = 1; i < n; i++){
        prev = (prev + arr[i]) > arr[i] ? (prev + arr[i]) : arr[i];
        max = max > prev ? max : prev;
    }
    return max;
}