题目:
题目链接:
大意:
在给出的矩阵当中,找出一个子矩形矩阵可以使得里面加起来的值是所有子矩阵中最大的。
思路:
将num数组初始化为一个把在自己的行数之前的同一列的值都加起来的一个数组。那么num[i][j] 表示的就是一个<=i行 且第j列的值都加起来的一个值。用三层for,枚举出两个矩形的起始行号,以及列数。这样那个就可以枚举出所有的可能。
代码:
#include <stdio.h>
#include <string.h>
using namespace std;
int num[105][105];
int s[105][105];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
scanf("%d",&num[i][j]);
num[i][j]=num[i-1][j]+num[i][j];
}
int Max=num[1][1];
for(int i=0; i<=n; i++)
{
for(int j=i; j<=n; j++)
{
int sum=0;
for(int k=1; k<=n; k++)
{
if(sum<0)sum=num[j][k]-num[i][k];
else if(i != j)
sum=sum+num[j][k]-num[i][k];
if(sum>Max&&sum!=0)
Max=sum;
}
}
}
printf("%d\n",Max);
}
return 0 ;
}