# 题目描述
在卷积神经网络(CNN)中,最大池化是一种常用的操作,用来对特征图进行降采样,从而减少数据量和计算量。最大池化会在特征图的每个区域中选取最大值作为该区域的代表值。
给定一个大小为 的矩阵和一个池化窗口的大小 ,你需要对这个矩阵进行最大池化操作,即将矩阵划分为若干个 的区域,并从每个区域中选取最大值,生成一个新的池化矩阵,具体的生成过程可参考样例解释。
# 输入格式
第一行包含四个整数 ,分别表示矩阵的行数、列数以及池化窗口的行数和列数(,且 是 的整数倍, 是 的整数倍)。
接下来  行,每行包含  个整数,表示矩阵中的元素值,保证元素值在  int  范围内。
# 输出格式
输出一个新的矩阵,表示经过 大小的最大池化操作后得到的池化矩阵。矩阵的同一行的相邻元素之间用一个空格隔开。
# 样例输入
4 4 2 2  | |
1 3 2 4  | |
5 6 7 8  | |
9 10 11 12  | |
13 14 15 16  | 
# 样例输出
6 8  | |
14 16  | 
# 样例解释
得到池化矩阵的过程如下图:

# 题解:模拟
用二维数组存下,直接依题意模拟即可。参考代码如下:
#include <stdio.h> | |
#include <math.h> | |
#include <limits.h> | |
int n, m, p, q, mat[105][105];  | |
int main()  | |
{ | |
    // freopen("D.in", "r", stdin); | |
    // freopen("D.out", "w", stdout); | |
scanf("%d%d%d%d", &n, &m, &p, &q);  | |
for (int i = 1; i <= n; ++ i)  | |
for (int j = 1; j <= m; ++ j)  | |
scanf("%d", &mat[i][j]);  | |
for (int i = 1; i <= n; i += p)  | |
    { | |
for (int j = 1; j <= m; j += q)  | |
        { | |
int max = INT_MIN;  | |
for (int u = i; u <= i + p - 1; ++ u)  | |
for (int v = j; v <= j + q - 1; ++ v)  | |
max = fmax(max, mat[u][v]);  | |
printf("%d ", max);  | |
        } | |
puts("");  | |
    } | |
return 0;  | |
} |