子矩阵的和算法

子矩阵的和

思想:就先把二维数组[i,j]想象成一个x,y坐标,把[0,0]看成原点,把它画在右下方,横轴代表列j,竖着的代表i。再用一个数组去保存前[i,j]矩阵里的和,原理是通过其各个部分加起来,再减去加了两次的地方。然后求子矩阵的和是用一个完全的矩阵减去不包含在其中的矩阵,然后再加上减了两次的地方,就得到了我们所需要的子矩阵的和。

注意。

不管是初始化矩阵还是求取初始化矩阵的[i,j]的和,他们都是从[1,1]开始的,因为最开始的数据要保存0,这样我们求矩阵和的时候才能更加方便,还有时刻注意那坐标的变化。

代码。

#include
const int N=1010;
int n,q,m;
int a[N][N],s[N][N];
int main()
{
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		scanf("%d",&a[i][j]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
		while(q--)
		{
			int x1,y1,x2,y2;
			scanf("%d%d%d%d",&x1,&y1,&x2,&y2);//为什么要减一呢,他是要外面的呀,因为你所求x1,x2被包含了。
			printf("%d\n",s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]);
		}
		
		return 0;
 } 

结果。

子矩阵的和算法_第1张图片

总结。

一定要注意细节,一定要想明白原理,一定要坚持下去。

你可能感兴趣的:(算法)