子矩阵的和(矩阵前缀和)


子矩阵的和(矩阵前缀和)

原创 于 2024-11-21 09:37:15 发布 · 粉丝可见 · 448 阅读 · 8 · 2 · 本内容遵循CC 4.0 BY-SA版权协议 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 GEO检测 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/143931563

题目链接: 用户登录 - C语言网

在这里可以模拟一下就知道了,
记录每个 (0,0) 到 (i,j)的矩阵和
然后区间子矩阵的和,就减去多余的部分的矩阵和就可以得到了 子矩阵的和

然后 这里最好使用 下标 1 ~ n 到 1 ~ m存储,这样就可以方便,根据一条规律来使用即可。

初始化函数

1
2
3
4
5
6
// 初始化矩阵前缀和
inline void Init(){
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] + a[i][j] - s[i - 1][j - 1];
}

获取矩阵和函数

1
2
3
4
5
6
// 根据左上角坐标以及右下角坐标获取矩阵和
inline int getSum(PII p1,PII p2){
int x1 = p1.x,y1=p1.y;
int x2 = p2.x,y2=p2.y;
return s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1];
}

题解代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define x first
#define y second
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
using PII = pair<int,int>;
const int N = 510;
int a[N][N],s[N][N],n,m,k,ans;
// 初始化矩阵前缀和
inline void Init(){
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] + a[i][j] - s[i - 1][j - 1];
}

// 根据左上角坐标以及右下角坐标获取矩阵和
inline int getSum(PII p1,PII p2){
int x1 = p1.x,y1=p1.y;
int x2 = p2.x,y2=p2.y;
return s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1];
}
signed main(){
IOS;
cin >> n;
m = n;
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j)
cin >> a[i][j];

// 初始化矩阵前缀和
Init();

// 循环遍历所有上下坐标,并获取矩阵和
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
PII leftUp = PII(i,j);
for(int x = i;x <= n;++x){
for(int y = j;y <= m;++y){
PII rightDown = PII(x,y);
int sum = getSum(leftUp,rightDown);
ans = max(sum,ans);
}
}
}
}

cout << ans << endl;
return 0;
}

最后提交


觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭

微信二维码

wechat pay

支付宝二维码

ali pay

子矩阵的和(矩阵前缀和)
http://blog.angindem.cn/2024/11/21/Angindem-CSDN博客/175_175/
作者
Angindem
发布于
2024年11月21日
许可协议