# ZeroJudge e798. p5. 卷積神經網路
<br>
> [題目 : e798. p5. 卷積神經網路](https://zerojudge.tw/ShowProblem?problemid=e798)
<br>
## 題目描述 :+1:
卷積神經網絡 (CNN) 是一種深度學習模型,主要應用於影像識別。CNN 一般分為三個部分:卷積層、池化層和全連接層。池化層中的最大池化法 (max pooling) 是常見的方法,將輸入的影像劃分為若干個 2×2 的矩形子區域,對每個子區域輸出最大值。
給定一個 n×n 的二維陣列,實作最大池化演算法並輸出池化後的結果。
* 最大池化法示意圖
* 
> 圖片來源:https://embarc.org/embarc_mli/doc/build/html/MLI_kernels/pooling_max.html
<br>
## 輸入說明 :+1:
第一行有一個正整數 n(4<=n<= 20,n 為 2 的倍數),代表輸入影像邊長。接下去有 n 行, 每行各有 n 個數字,數值範圍[-2^31, 2^31) {原題不明確,這明定為int範圍},以空白隔開,代表影像陣列中的資料值。
<br>
## 輸出說明 :+1:
輸出經 2x2 最大池化後的結果。
<br>
## 解題思路 :+1:
1. **讀取輸入**:首先讀取二維陣列的大小為 n 的元素。
2. **實作最大池化**:將輸入矩陣分成 2x2 的子區域,計算每個子區域中的最大值。
3. **輸出結果**:每次計算出最大值後印出答案。
<br>
## 程式碼 :+1:
```cpp=
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
int matrix[20][20];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> matrix[i][j];
}
}
for (int i = 0; i < n; i += 2) {
for (int j = 0; j < n; j += 2) {
int a = matrix[i][j];
int b = matrix[i][j + 1];
int c = matrix[i + 1][j];
int d = matrix[i + 1][j + 1];
cout << max({a, b, c, d}) << ' ';
}
cout << endl;
}
return 0;
}
```
## 成果截圖 :+1:
* 
<br>
## 心得 :+1:
* 第一次寫解題報告,希望可以幫助到人~~