前缀和算法用于计算序列或者矩阵的某一部分的和。适用于静态序列,只适合查询操作。
一维前缀和:
想要求序列中橙色部分的和,就可以用si-sj获得
si的计算方法是:si-1+ai
子序列的计算方法是:si-sj
二维前缀和:
给定一个矩阵,给出子矩阵的左上标(x1,y1),给子矩阵的右下标(x2,y2),求出子矩阵所有数的和
s[i][j]代表,包含第i行第j列在内的左上角所有数的和
计算s[i][j]的方法:
s[i][j]的值是蓝色部分(s[i-1,j])加上粉色部分(s[i,j-1])减去重叠部分(s[i-1,j-1])再加上a[i][j]的值
s[i][j]=s[i-1,j]+s[i,j-1]-s[i-1,j-1]+a[i][j]
计算子矩阵和:
我们求的部分是④,④的计算方法是整个大的矩形减去(①+③)再减去(①+②),①被减去了两次,所以再加上一次①
整个矩形:s[x2,y2]
①+③:s[x2,y1-1]
①+②:s[x1-1,y2]
①:s[x1-1,y1-1]
④=整个矩形-(①+③)-(①+②)+①
=s[x2,y2]-s[x2,y1-1]-s[x1-1,y2]+s[x1-1,y1-1]
所以子矩阵(x1,y1),(x2,y2)的矩阵的和是s[x2,y2]-s[x2,y1-1]-s[x1-1,y2]+s[x1-1,y1-1]
s[i][j]的计算方法是:s[i][j]=s[i-1,j]+s[i,j-1]-s[i-1,j-1]+a[i][j]