描述:
杰克正在他的花园里种一些花生。花园是一个长*宽的矩形,每个单位面积都有自己独立的花生数量。他想找出在给定大小的区域中花生的最大数量是多少。该区域的大小固定为 a*b。
输入格式:
第 1 行:2 整数长度 L 和宽度 W
Line 2 - L+1 : 每行W整数,代表单位面积花生的数量,A(0<=A<=10)</p>
Line L+2 : 2个整数,a和b,分别代表选中区域的长宽
输出格式:
一个整数m,即选择的a*b区域内花生数量的最大总和
样本输入:
4 5
1 2 3 4 5
6 7 8 0 0
0 9 2 2 3
3 0 0 0 1
3 3
样本输出
38
数据满足:1≤a≤L,1≤b≤W
我认为这个问题可以抽象为:返回我认为有 (L-a+1)*(W-b+1) 个可能的和的 L*W 数组的 a*b 子数组中数字的最大和我必须找到最大值。
我的代码在这里,它不能给出正确的结果。我的代码总是返回区域左上区域的总和,但实际上问题需要返回所有可能位置中 a*b 区域的 MAXIMUM SUM。提前非常感谢!
#include <iostream>
#include <cstring>
using namespace std;
int L,W,a,b,i,j,x,y,p,q,r,s;
int main()
{
cin>>L>>W;
int peanut[L][W];
for (i=0;i<L;i++)
for (j=0;j<W;j++)
cin>>peanut[i][j];
cin>>a>>b;
int sumArray[L-a+1][W-b+1];
memset(sumArray,0,(L-a+1)*(W-b+1)*sizeof(int));
for (p=0;p<L-a+1;p++)
for (q=0;q<W-b+1;q++)
{
for (r=p;r<a;r++)
for (s=q;s<b;s++) sumArray[p][q]+=peanut[r][s];
}
int max = 0;
for (x=0;x<L-a+1;x++)
for (y=0;y<W-b+1;y++)
if (sumArray[x][y]>max) max=sumArray[x][y];
cout << max;
return 0;
}