题意:给你一个N*M的矩形,每个格子里有个数,让你求出他的子矩形中数字之和最大的数。
分析:把矩形看作一个二维数组,可以合并每列上的数,然后枚举用三个for循环来控制俩个行和一个列,a行和b行,最大矩形肯定在a行和b行之间 ,可以通过求出两个的矩形差来求任意一个矩形的数字之和。
a[i][j]表示在j列上的0到i的数字和
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int a[110][110];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]); //
a[i][j]+=a[i-1][j]; //合并每列上的数
}
int sum;
int maxx=-1;
for(int i=1;i<=n;i++) //控制a行
{
for(int j=i+1;j<=n;+j++) //控制b行 b肯定比a大
{
sum=0;
for(int k=1;k<=n;k++) //控制列
{
if(sum<0) //如果矩形的和小于0,sum=0
sum=0;
sum+=a[j][k]-a[i][k]; //枚举矩形 算出矩形的大小
if(sum>maxx)
maxx=sum;
}
}
}
printf("%d\n",maxx);
}}