1前缀和算法:
就是把一个数列的n个数相加,但是不同段相加的数列和,做减法,可以得到不同段(不从1开始)的数列和,这是一维上的应用
- sum[0]=a[0]
- sum[1] = a[0] + a[1]sum[1]=a[0]+a[1]
- sum[2] = a[0] + a[1] + a[2]sum[2]=a[0]+a[1]+a[2]
利用递推,只要计算 n 次,就能计算出所有的前缀和:sum[i] = sum[i-1] + a[i]。当然,我们也能用 sum[]sum[] 反推计算出 a[]a[]:a[i] = sum[i] - sum[i-1]。
具体应用:
一维:S[i] = a[1] + a[2] + ... a[i]
a[l] + ... + a[r] = S[r] - S[l - 1]
二维前缀和:
S[i, j] = 第i行j列格子左上部分所有元素的和
S[i][j] =S[i-1][j]+S[i][j-1] -S[i-1][j-1]+a[i][j]
具体应用:激光炸弹
地图上有 NN 个目标,用整数 Xi,YiXi,Yi 表示目标在地图上的位置,每个目标都有一个价值 WiWi。
注意:不同目标可能在同一位置。
现在有一种新型的激光炸弹,可以摧毁一个包含 R×RR×R 个位置的正方形内的所有目标。
激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆炸范围,即那个正方形的边必须和 x,yx,y 轴平行。
求一颗炸弹最多能炸掉地图上总价值为多少的目标。
输入格式
第一行输入正整数 NN 和 RR,分别代表地图上的目标数目和正方形的边长,数据用空格隔开。
接下来 NN&n