不论一维还是二维,初始化都要从下标1开始
/*一维前缀和*/
/*初始化*/
int a[n+1]; //原始数组,从下标1开始存放数据
int s[n+1]; //前缀和 ,s[0]=0
for(int i=1;i<=n;i++){
s[i]=s[i-1]+a[i];
}
/*求区间[a,b]的和*/
int ans = s[b]-s[a-1];
/*二维前缀和*/
/*初始化*/
int a[n+1][n+1];
int s[n+1][n+1];
for(int i=1;i<=n;i++)
for(int j=1;i<=n;j++)
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
/*求左上角点 a(x1,y1) 与右下角点 b(x2,y2) 之间矩形区域数据的和*/
//包括a,b两点
int ans= s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1];