子矩阵的和(矩阵前缀和)
原创 于 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; }
|
最后提交
