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;
}