一维前缀和:
给定N个数a1 a2 a3 a4 … an
求[L,R]范围内的和
我们用sum[k] 表示 前k个数的和
那么sum[k] = sum[k-1] + ak;
[L,R] 范围内的和就为 sum[R] - sum[i-1]
二维前缀和:
给定一个矩阵,求数字和最大的子矩阵
4 * 4的矩阵
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
最大子矩阵是
9 2
-4 1
-1 8
我们用sum[i][j] 表示 0-i行,0-j列矩阵的和
sum[i][j] = sum[i][j-1] + sum[i-1][j] - sum[i-1][j-1] + a[i][j]
int get(int x,int y1,int y2){
return s[x][y2]-s[x-1][y2]-s[x][y1]+s[x-1][y1];
}
for(int y2=1;y2<=n;y2++)
for(int y1=0;y1<y2;y1++)
for(int x=1;x<=n;x++){
f[x]=max(0,f[x-1])+get(x,y1,y2);
ans=max(ans,f[x]);
}