求最大子矩阵的和:
思路:我们可以将这个二维数组转化为一维数组(参考其他人的思路,不过我认为将它转化为一维数组就相当于暴力列举出所有的子矩阵,具体位置在代码注释中写明),然后对这个一维数组求最大连续子序列的和。
代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int e[110][110];
int max_sum(int a[],int n)//求一维数组最大子序列的和
{
int sum=0,m=-999999;
for(int i=0;i<n;i++)
{
sum+=a[i];
if(sum>m)
m=sum;
if(sum<0)
sum=0;
}
return m;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int b[110];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
scanf("%d",&e[i][j]);
}
int m=-99999,sum=0;
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)//两层循环,列出所有的矩阵
{
memset(b,0,sizeof(b));
for(int w=i;w<=j;w++)//转化为一维数组,对每一列求和
{
for(int k=0;k<n;k++)
b[k]+=e[w][k];
}
sum=max_sum(b,n);
m=max(sum,m);//求出最大的一维数组子序列的和
}
}
printf("%d\n",m);
}
return 0;
}