2015-04-03 102 views
0

我试图在Hacker Rank中做一个练习,但发现我的代码(下面)太线性了。为了使它更好,我想知道是否有可能将数组分解为固定大小的小数组来完成此练习。如何将数组分解为固定大小的小数组? (在C中)

The Exersise on HackerRank

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

回答

0

尽管“破”成块意味着我们会被在内存中移动的东西,你可以去“观察”这样的数组,它是等价的。

在一个非常真实的意义上,数组的名称只是一个指向第一个元素的指针。当您取消引用数组的元素时,将使用数组映射函数来执行指针运算,以便可以找到正确的元素。这是必要的,因为C数组本身并没有任何指针信息来识别元素。

然而,如何将数组存储的本质用于将数据视为任意大小的任意数组。例如,如果我们有:

int integers[] = {1,2,3,4,5,6,7,8,9,10};

,你可以认为这是一个数组:

for(i=0;i!=10;i++){ printf("%d\n", integers[i]); }

但上述阵列也可以做到这一点出发:

int *iArray1, *iArray2; 
iArray1 = integers; 
iArray2 = integers + (5 * sizeof(int)); 
for(i=0;i!=5;i++){ printf("%d - %d\n", iArray1[i], iArray2[i]);} 

这样我们选择查看数据为两个5 t erm数组。

0

该问题不在线性解决方案中。主要问题在于算法的复杂性。因为它写的是O(N^4)。此外,我认为你的解决方案是不正确的,因为:

ceulluar塔可以覆盖Y行X列Regtangular区域。

这并不意味着什么y行和X列恕我直言,你能找到一个解决方案,其中的尺寸小于X,Y

的问题,例如,使用动态规划是在合理的时间内可解。尝试使用动态编程优化您的程序到O(N^2)。