最大子矩阵的和
题目
给出一个N [2<=N<=100],并给出一个N*N的矩阵,矩阵中的数为[-127,127]之间。求出矩阵中一块子矩阵的最大和。
比如:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
和最大的子矩阵应该是这个:
9 2
-4 1
-1 8
它的和是15。
输入
第一行:整数n
接下来n行,每行n个整数,表示矩阵每个点所代表的值。
输入样例
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-18 0 -2
输出
矩阵的最大子矩阵的和
输出样例
15
思路
我们先求出每个数的前缀和,然后用公式求出每一个矩阵的和,在求出最大的矩阵和,就可以了。
公式为:
t+=a[j][k]-a[i-1][k];
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[101][101];//初始化
int main()
{
int n,l;//初始化
memset(a,0,sizeof(a));//数组清零
scanf("%d",&n);//读入
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
scanf("%d",&l);//读入
a[i][j]=a[i-1][j]+l;//求前缀和
}
int maxn=-214748364;//初始化
for (int i=1;i<=n;i++)
for (int j=i;j<=n;j++)
{
int t=0;//初始化
for (int k=1;k<=n;k++)
{
t+=a[j][k]-a[i-1][k];//求子矩阵和
maxn=max(maxn,t);//求最大子矩阵的和
}
}
printf("%d",maxn);//输出
return 0;
}