请问这道编程题怎么做?
设pre[i][j]为二维数组f的第1行到第I行第J列的矩形区域内的元素之和。
即左上角元素为f[0][0],右下角元素为f[i-1][j-1]的矩形元素之和。
根据不相容原理,有f[I-1][J-1]= pre[I][J]-pre[I]-pre[I]。
因此,整个二维前缀和数组pre可以首先根据下面的递归关系得到:
pre[I][j]= pre[I-1][j]+pre[I][j-1]-pre[I-1][j-1]-f[I-1][j-1]
有了pre,只要给出左上角坐标(a,b)和右下角坐标(c,d),就可以快速求出矩形中元素的和:
sum = pre[c][d]-pre[c][b-1]-pre[a-1][d]+pre[a-1][b-1]
c语言代码和运行结果如下:
输出符合实例,望采纳~
附加源代码:
# include & ltstdio.h & gt
int f[1000][1000],pre[1001][1001];// pre是二维前缀和数组。
int main() {
int n,I,j,max =-1 E8;//-100 * 1000 * 1000,最大值初始化为可能的最小值。
int m,a,b,c,d,sum
scanf("%d ",& ampn);
for(I = 0;我& ltn;i++) {
for(j = 0;j & ltn;j++)
scanf("%d ",& ampf[I][j]);
}
for(I = 1;我& lt= n;i++) {
for(j = 1;j & lt= n;J++) {//前缀和包含与排除原理的递归公式
pre[I][j]= pre[I-1][j]+pre[I][j-1]-pre[I-1][j-1]+f[I-1][j-1];
}
}
scanf("%d ",& ampm);
while (m - ) {
scanf("%d %d %d %d ",& amp一,& ampb & amp;c,& ampd);
sum = pre[c][d]-pre[c][b-1]-pre[a-1][d]+pre[a-1][b-1];
if(sum & gt;max)max = sum;
}
printf("%d\n ",max);
返回0;
}