C++ 关于C++;,我的解决方案有什么问题?
说明:C++ 关于C++;,我的解决方案有什么问题?,c++,C++,说明: 4 5 1 2 3 4 5 6 7 8 0 0 0 9 2 2 3 3 0 0 0 1 3 3 杰克正在花园里种花生。花园是一个长宽的长方形,每个单位面积都有其独立的花生收获数量。他想知道在一个给定大小的区域,花生的最大数量是多少。此区域的大小固定为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 第1行:2整数长度L和宽度W 第2行-L+1:W每行整数,表示单位面积内的花生数量,A(0L>>W; 国际花生[L][W]
4 5
1 2 3 4 5
6 7 8 0 0
0 9 2 2 3
3 0 0 0 1
3 3
杰克正在花园里种花生。花园是一个长宽的长方形,每个单位面积都有其独立的花生收获数量。他想知道在一个给定大小的区域,花生的最大数量是多少。此区域的大小固定为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
第1行:2整数长度L和宽度W
第2行-L+1:W每行整数,表示单位面积内的花生数量,A(0L>>W;
国际花生[L][W];
对于(i=0;ipeanut[i][j];
cin>>a>>b;
int-summarray[L-a+1][W-b+1];
memset(summarray,0,(L-a+1)*(W-b+1)*sizeof(int));
对于(p=0;p有两个问题。首先,
a
和b
是测试区域的大小
for (r=p;r<a;r++)
for (s=q;s<b;s++)
sumArray[p][q]+=peanut[r][s];
第二个问题是38是答案;最左上方的区域包含所有子矩形的最大值。这是我打印所有值的解决方案。应该注意的是,当X
和Y
不是常量(无法编译)时,我对int arr[X][Y]
业务不熟悉,所以我把它改成了我熟悉的东西
#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;
}
#包括
#包括
使用名称空间std;
int L,W,a,b,i,j,x,y,p,q,r,s;
int main()
{
cin>>L>>W;
int**peans=new int*[L];//每个列元素的新行指针
对于(i=0;ipeanut[i][j];
}
cin>>a>>b;
//不需要记住结果;只需在每次评估后比较最大值即可。
//int-summarray[L-a+1][W-b+1];
//memset(summarray,0,(L-a+1)*(W-b+1)*sizeof(int));
int max=0;
对于(p=0;p而言,问题在于这一部分:
for (r=p;r<a;r++)
for (s=q;s<b;s++) sumArray[p][q]+=peanut[r][s];
问题是您没有仔细索引元素以计算sumArray
。我只更改了两行代码以使其正常工作
for (r=0;r<a;r++)
for (s=0;s<b;s++) sumArray[p][q]+=peanut[p+r][q+s];
(r=0;rL>>W;
国际花生[L][W];
对于(i=0;ipeanut[i][j];
cin>>a>>b;
int-summarray[L-a+1][W-b+1];
memset(summarray,0,(L-a+1)*(W-b+1)*sizeof(int));
对于(p=0;p代码有什么问题?我刚刚用您的示例运行了它,并给出了正确的输出。int-peant[L][W]这不是C++ C++……子区域只定义为范围,而不是位置,我看不出要问中间3x3段。@ PeDROM:这是GCC扩展。它不是C++索引。首先,38是数组左上3x3区域的值之和,所以也许你应该重新表述你的问题?你说你的代码返回了左上方区域的总和,但这似乎是正确的-那么您的代码实际返回的是什么?第二:变量名-它们可能对您有意义,但对其他所有人来说都是神秘的,我只是在尝试读取代码时感到头痛,更不用说调试了。别忘了释放分配的内存,或者(更好)改为使用std::vector
。我不想包含新的头,程序在处理完数组后会结束。如果程序后来做了其他事情,那么删除肯定是必要的。非常感谢!它工作得很好。我发现了问题所在。:)@Aggieboy然而,当我将代码提交在线判断时,我得到了超出时间限制。我如何改进算法?接受(时间:0ms,内存:5052kb)接受(时间:0ms,内存:4964kb)接受(时间:410ms,内存:7044kb)超过时间限制(时间:0ms,内存:0kb)超过时间限制(时间:0ms,内存:0kb)接受(时间:740ms,内存:6744kb)接受(时间:530ms,内存:8364kb)超过时间限制(时间:0ms,内存:0kb)超过时间限制(时间:0ms,内存:0kb)接受(时间:0ms,内存:5116kb)您是否在最后删除了cin>>s;
?我之所以这样做是因为我在Visual Studio中,并且控制台将在我看到输出之前关闭。此外,删除无关的cout
命令将提高性能。
for (r=p;r<a;r++)
for (s=q;s<b;s++) sumArray[p][q]+=peanut[r][s];
for (r=p;r<p+a;r++)
for (s=q;s<q+b;s++) sumArray[p][q]+=peanut[r][s];
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;
}