#include <algorithm> #include <climits> #include <iostream> using namespace std; /* 最大子矩阵: 1. 单行(i)->转化为最大子序列 2. 多行(i-j)->将第i行到第j行所有行元素相加得到一维数组,这个一维数组的最大子序列和就是最大子矩阵和 3. 只需从小到大一次枚举并遍历i和j,接着输出所有子矩阵中的最大值 4. 可以事先用一个辅助二维数组记录从第一行到第i行的累加值,求i到j行的累加值时只需要做一次减法即可 */ const int MAXN = 101; const int MINN = -INT_MAX; int assist[MAXN][MAXN]; int arr[MAXN][MAXN]; int seq[MAXN]; int dp[MAXN]; // 以第i行结束的矩阵的最大子矩阵的和 //创建辅助矩阵assist,储存以第i行结尾的子矩阵之和的序列 void BuildAssist(int n){ int tmp[n]; for(int i=0; i<n; ++i) tmp[i] = 0; for(int i=0; i<=n; ++i){ //assist第0行全设为0,方便后面相减 for(int j=0; j<=n; ++j){ assist[i][j] = tmp[j]; if(i < n) tmp[j] += arr[i][j]; } } for(int i=0; i<n; ++i) seq[i] = arr[0][i]; } //计算某一行序列的最大子串和 int MaxSeq(int n){ dp[0] = seq[0]; for(int i=1; i<n; ++i){ dp[i] = max(seq[i], dp[i-1]+seq[i]); } int res = dp[0]; for(int i=0; i<n; ++i){ if(res<dp[i]) res = dp[i]; } return res; } int MaxMatrix(int n){ int res, matrixMax = -INT_MAX; //从第一行开始枚举,计算以第i行结尾的最大子矩阵的和 for(int i=1; i<=n; ++i){ for(int j=0; j<i; ++j){ for(int k=0; k<n; ++k){ seq[k] = assist[i][k]-assist[j][k]; } res = MaxSeq(n); if(res>matrixMax) matrixMax = res; } } return matrixMax; } int main() { int n; cin>>n; for(int i=0; i<n; ++i) for(int j=0; j<n; ++j) cin>>arr[i][j]; BuildAssist(n); int res = MaxMatrix(n); cout<<res<<endl; }