2021级新生个人训练赛第21场
寻找子矩阵
AC代码
#include <bits/stdc++.h>
using namespace std;
int a[1001][1001];
int i, j, n, m, p, q;
int main()
{
cin>>n>>m>>p>>q;
//输入数据
for(i = 0; i < n; i++) {
for(j = 0; j < m; j++) {
cin>>a[i][j];
}
}
//压缩行
int cnt = 1;
for(i = 0; i < n - p + 1; i++) {
for(j = 0; j < m; j++) {
while(cnt != p) {
a[i][j] += a[i + cnt][j];
cnt++;
}
cnt = 1;
}
}
//压缩列
cnt = 1;
for(i = 0; i < n - p + 1; i++) {
for(j = 0; j < m - q + 1; j++) {
while(cnt != q) {
if(cnt % 2 ==0) {
a[i][j] += a[i][j + cnt];
}
else {
a[i][j] -= a[i][j + cnt];
}
cnt++;
}
cnt = 1;
}
}
//遍历求最大值
int ans = INT_MIN;
for(i = 0; i < n - p + 1; i++) {
for(j = 0; j < m - q + 1; j++) {
ans = max(ans, abs(a[i][j]));
}
}
cout<<ans;
}