说明
杰克在他的花园里种了一些花生。花园是一个L * W长方形,每个单位区域都有其独立的花生数量。他想知道在给定大小的地区花生的最大数量是多少。该区域的固定大小为a * b。输入格式:
第1行:2个整数长度L和宽度W
第2行 - L + 1:每行W个整数,表示单位面积中花生的数量,A(0 <= A <= 10)
线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 * W数组的* b子数组中的最大数字和 我认为有(L-a + 1)*(W-b + 1)可能的总和,我必须找到最大值。
我的代码在这里,无法给出正确的结果。我的代码总是返回区域的左上区域的总和,但实际上问题需要在所有可能的位置中返回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;
}
答案 0 :(得分:1)
问题是你没有仔细索引元素来计算sumArray
。我只更改了两行代码才能使其正常工作。
for (r=0;r<a;r++)
for (s=0;s<b;s++) sumArray[p][q]+=peanut[p+r][q+s];
以下是完整代码。如果还有其他问题,请修复它。
#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=0;r<a;r++)
for (s=0;s<b;s++) sumArray[p][q]+=peanut[p+r][q+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;
}
答案 1 :(得分:0)
有两个问题。首先,a
和b
是测试区域的大小。
for (r=p;r<a;r++)
for (s=q;s<b;s++)
sumArray[p][q]+=peanut[r][s];
此处,p
和q
代表初始设置,但是您要根据子标注维度限制检查索引。相反,它应该是:
for (r=p;r<p+a;r++)
for (s=q;s<q+b;s++)
sumArray[p][q]+=peanut[r][s];
第二个问题是38 是答案; topleft-most区域包含所有子矩形的最大值。这是我打印所有值的解决方案。应该注意的是,当int arr[X][Y]
和X
不是const(无法编译)时,我不熟悉这个Y
业务,因此我将其更改为I熟悉。
#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=new int*[L]; //a new row pointer for each column element
for (i=0;i<L;i++){
peanut[i]=new int[W]; //the actual row for each column element
for (j=0;j<W;j++)
cin>>peanut[i][j];
}
cin>>a>>b;
//don't need to remember results; just compare maximum after each evaluation.
//int sumArray[L-a+1][W-b+1];
//memset(sumArray,0,(L-a+1)*(W-b+1)*sizeof(int));
int max = 0;
for (p=0;p<L-a+1;++p){
for (q=0;q<W-b+1;++q){
int sum=0;
for (r=p;r<p+a;++r) //r<p ==> r<p+a, prefix increment is always better
for (s=q;s<q+b;++s){ //s<q ==> s<q+b, prefix increment is always better
cout << "(" << r << "," << s << "," << peanut[r][s] << ") ";
sum+=peanut[r][s];
}
cout << sum << endl;
if(sum>max) max=sum;
}
}
/* Merged in previous loop
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 << "Answer: " << max;
//Since I'm in Visual Studio, I need to pause and see the result before quitting...
int s;
cin >> s;
return 0;
}
答案 2 :(得分:0)
问题在于这一部分:
for (r=p;r<a;r++)
for (s=q;s<b;s++) sumArray[p][q]+=peanut[r][s];
您没有迭代a
和b
次。将其更改为:
for (r=p;r<p+a;r++)
for (s=q;s<q+b;s++) sumArray[p][q]+=peanut[r][s];