C 如何在二维数组中找到给定范围的最大和?

C 如何在二维数组中找到给定范围的最大和?,c,C,我需要知道如何在2D数组中找到给定范围的最大和,最好是在C中,以提高下面给出的代码的效率并解决问题 为了更好地理解这一点,请阅读下面我需要解决的问题 问题 大城市X是一个由N行和M列组成的网格。这里有 每个单元中居住的人数。您被要求定位 电信塔让尽可能多的人感到满意。这个 蜂窝塔可以覆盖Y行和X列的矩形区域。 找到你能满足的最大人数 约束 样本输出 解释 通过将塔架覆盖2x3区域,包括5、6、7、2、9和9个单元,可满足最大人数的需求 5 + 6 + 7 + 2 + 9 + 9 = 38 我的

我需要知道如何在2D数组中找到给定范围的最大和,最好是在C中,以提高下面给出的代码的效率并解决问题

为了更好地理解这一点,请阅读下面我需要解决的问题

问题

大城市X是一个由N行和M列组成的网格。这里有 每个单元中居住的人数。您被要求定位 电信塔让尽可能多的人感到满意。这个 蜂窝塔可以覆盖Y行和X列的矩形区域。 找到你能满足的最大人数

约束

样本输出

解释

通过将塔架覆盖2x3区域,包括5、6、7、2、9和9个单元,可满足最大人数的需求

5 + 6 + 7 + 2 + 9 + 9 = 38
我的代码

这段代码失败了,因为它太线性了,当使用较大的输入时需要花费大量时间


您可以自己尝试这个问题,

我想您解决的数字网格问题的主要问题是嵌套循环。最简单的优化是最小化范围每次移动的重新计算次数

我在原始代码中尝试了以下更改:

包括 包括 包括 包括 int main{ int N,M,Y,X; 扫描%d%d%d%d,&N,&M,&Y,&X; int max=0; int-total=0; 整数数据[N][M]; forint i=0;iFiTnI=0;I+Y尝试思考如何解决这个问题的一维等价性。例如,考虑一个具有3, 5, 7、6, 1 }的单极城市。如果一个塔覆盖了3个单元格。你真的会检查3+5+7、5+7+6、7+6+1吗?或者你能做些更有效的事情吗?还是不知道!:@mooseboysy你可以计算s=3+5+7,然后s+=6-3,然后s+=1-5。在计算第一个和之后,你只需要访问两个元素来生成后续的元素,方法是删除最左边的元素一个并添加了最右边的一个。二维的情况类似。谢谢:@MooseBoys
4 5 2 3
3 1 1 1 2
2 5 6 7 1
1 2 9 9 1
1 1 1 1 1
38
5 + 6 + 7 + 2 + 9 + 9 = 38
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {

int N, M, Y, X;
scanf("%d %d %d %d", &N, &M, &Y, &X);

int max = 0;
int total = 0;

int data[N][M];

for(int i = 0; i < N; i++)
    for(int j = 0; j < M; j++)
        scanf("%d",&(data[i][j]));    

for(int i = 0; i < N; i++)
{
    for(int j = 0; j < M; j++)
    {
        total = 0;

            for(int l = 0; (l < Y) && (i + Y) <= N; l++)
            {

                for(int k = 0; (k < X) && (j + X <= M); k++)
                {
                    total += data[i+l][j+k];
                }

                if(total > max)
                    max = total;                       
        } 
    }  
}   

printf("%d",max);
return 0;
}