题目描述:
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1×1)子矩阵。
题解:
代码显示如下:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 210;
bool st[N];
int n, m, k;
int hel[N][N], sta[N][N],s[N];
void solve() {
int n;
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> sta[i][j];
for (int i = 0; i < n; i++)//构造辅助矩阵
hel[0][i] = sta[0][i];
for (int i = 1; i < n; i++) {//前缀和
for (int j = 0; j < n; j++) {
hel[i][j]=hel[i-1][j]+sta[i][j];
}
}
int mx=-0x3f3f3f3f;
int sum=0;
for(int i=0;i<n;i++)//以第i行为首
{
for(int j=i;j<n;j++)//以第j行为尾
{
sum=0;
for(int k=0;k<n;k++)//求第i行到第j行的最大子矩阵和,也是第i行到第j行的辅助矩阵的最大子段和
{
if(i==0) s[k]=hel[j][k];
else s[k]=hel[j][k]-hel[i-1][k];
if(sum>=0) sum+=s[k];
else sum=s[k];
mx=max(sum,mx);
}
}
}
cout<<mx<<endl;
}
signed main() {
int _ = 1;
// cin >> _;
while (_--) solve();
return 0;
}