一、问题特点
一维数组中转变为前缀和数组之后,每一行就代表着前几项的总和,同理前缀和矩阵中每一个元素代表着以这个一个元素为右下角矩阵里面所有元素的和。
比如有一数组如下:
map[2][3]
1 2 3
4 5 6
那么对应的前缀和为:
sum[2][3]
1 3 6
5 12 21
二、求一个矩阵的前缀和矩阵规律
一个矩阵的前缀和矩阵的每一个元素等于原矩阵对应的元素+前缀和矩阵对应元素同一行的前一列元素+前缀矩阵对应元素同一列的前一行元素-前缀矩阵对应元素对角的那个元素,记忆如下:
sum[i][j]=map[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];//求矩阵前缀和
map为原矩阵,sum为map对应的前缀和矩阵
比如上面那个例子,在原矩阵中(1,1)对应的前缀和矩阵sum[1][1]=5+3+5-1=12
三、代码实现如下:
#include<cstdio>
#include<iostream>
using namespace std;
int sum[1010][1010],map[1010][1010];
int main() {
int n,m,r,c,maxx=0;
scanf("%d%d%",&n,&m);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++) {
scanf("%d",&map[i][j]);
sum[i][j]=map[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];//求矩阵前缀和,前缀和矩阵的每一个元素等于原矩阵对应的元素+前缀和矩阵对应元素同一行的前一列元素+前缀矩阵对应元素同一列的前一行元素-前缀矩阵对应元素对角的那个元素
}
cout<<"打印开始!!!"<<endl;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cout<<sum[i][j]<<" ";
}
cout<<endl;
}
//cout<<"打印结束"<<endl;
}
四、刷题心得
都说了很多次,做题的时候,不要一下子就模拟,先分析数据的特点,看能否找到规律,以后看到矩阵变化的时候,就去分析变化后的矩阵和原矩阵的元素有什么关系,是要同时看两个矩阵,而不是单单只研究其中一个矩阵,这个前缀和矩阵的规律,就是通过这样分析得到的不仅是矩阵,以后出现那种变化的题目,都要去分析变化前后的数据有什么特点,找规律。