先看上一章学习了一维前缀和之后再来学习吧,不然小小玖你会不懂的。
首先你必须还要学会二维数组,才能进行下去哦!!
先来小小讲讲二维数组吧
如果把一维数组看作线:
i | 0 | 1 | 2 | 3 | 4 |
a[i] | 2 | -4 | 9 | 23 | 87 |
那二维数组就是面:
1 | 2 | 3 | 4 | 5 | 6 | |
1 | b[1][1] | ... | .... | ... | ... | ... |
2 | b[1][2] | b[2][2] | ... | b[2][4] | .... | ... |
3 | ... | ... | ... | ... | ... | ... |
4 | ... | ... | ... | ... | b[4][5] | ... |
5 | ... | ... | b[5][3] | ... | .... | b[5][6] |
就像坐标一样定位。
下面进行二位前缀和的讲解:
首先在求和顺序上,看上面的那张表格,只有求完一行上的数之后,才能进行下一行的计算。
我们要求前缀和时,如果仿照求一维的那样,(i与j都在循环)sum[i][j]=sum[i][j-1]+a[i][j],就错了,你想想当处于两行交换之时,该式子就不成立了。
所以,我们另想办法;
用b[2][2]+b[2][3]+b[3][2]+b[3][3]+b[4][2]+b[4][3]之和 加上 b[2][2]+b[2][3]+b[2][4]+b[3][2]+b[3][3]+b[3][4]之和 减去 b[2][2]+b[2][3]+b[3][2]+b[3][3]之和 加上 a[4][4];
总结下来就是:
sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+a[i][j]
我们求某个区间内的和时:
例如:看上面的3*3的绿色字体方框,计算机计算的顺序为s=b[2][2]+b[2][3]+b[2][4]+b[3][2]+b[3][3]+b[3][4]+b[4][2]+b[4][3]+b[4][4];
总结下来就是:s=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];(理解与求前缀和相同)