题目大意:对于n*n的矩阵,求它的最大子矩阵和。
其实就是最大子串和的扩展版本,当然首先尝试用最大子串和的变体解决这道题。
首先考虑到求矩阵的每一个子矩阵和都可以首先对行或列累加,就把二维矩阵求和转化成一维数组求和。把这一点想办法转化到求最大子串和。
可以初始化时对输入矩阵进行处理,ai表示第i行前j个数字之和。
在计算所有子矩阵的和时,用i,j控制子矩阵的左右区间,用k遍历子矩阵每一行(也就是把子矩阵同行数字相加,成一列一维数组,对这个数组用求最大子串和的方法即可求出最大值)。而调整初始矩阵是为了避免重复累加数据,节省时间。
代码:
#include <stdio.h>
#define MAX 101
int main()
{
int n;
int a[MAX][MAX]={0};
int colsum[MAX][MAX]={0};
int maxn=0,sum;
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j-1]);
colsum[i][j]=colsum[i][j-1]+a[i][j-1];
}
for(int i=0;i<n;i++)
for(int j=i;j<=n;j++)
{
sum=0;
for(int k=0;k<n;k++)
{
sum+=colsum[k][j]-colsum[k][i];
if(sum<0)
sum=0;//保证有正数数据才正确
else if(sum>maxn)
maxn=sum;
}
}
printf("%d\n",maxn);
return 0;
}