熱門文章

2025年2月2日 星期日

ZeroJudge 解題筆記:e798. p5. 卷積神經網路

作者:王一哲
日期:2025年2月2日



ZeroJudge 題目連結:e798. p5. 卷積神經網路

解題想法


可以讀取完整個矩陣的資料再處理最大池化,也可以每讀 2 列矩陣資料就輸出一次最大池化的結果,效率差不多。

Python 程式碼


使用時間約為 18 ms,記憶體約為 3.3 MB,通過測試。
n = int(input())  # 矩陣大小 n*n
mat = [list(map(int, input().split())) for _ in range(n)]  # 讀取矩陣資料
pool = [[0]*(n//2) for _ in range(n//2)]  # 儲存最大池化的結果
for r in range(0, n, 2):  # 依序掃過第 0 ~ n-1 列,每次跳 2 列
    for c in range(0, n, 2):  # 依序掃過第 0 ~ n-1 欄,每次跳 2 欄
        pool[r//2][c//2] = max(mat[r][c], mat[r][c+1], mat[r+1][c], mat[r+1][c+1])  # 取 4 格中的最大值
for row in pool: print(*row)  # 依序印出 pool 每列的資料

每讀取 2 列就輸出 1 次,使用時間約為 19 ms,記憶體約為 3.3 MB,通過測試。
n = int(input())  # 矩陣大小 n*n
for r in range(0, n, 2):  # 依序掃過第 0 ~ n-1 列,每次跳 2 列
    row1 = list(map(int, input().split()))  # 讀取 2 列
    row2 = list(map(int, input().split()))
    pool = [0]*(n//2)  # 儲存最大池化結果的串列
    for c in range(0, n, 2):  # 依序掃過第 0 ~ n-1 欄,每次跳 2 欄
        pool[c//2] = max(row1[c], row1[c+1], row2[c], row2[c+1])  # 取 4 格中的最大值
    print(*pool)  # 印出 pool 的資料


C++ 程式碼


使用時間約為 2 ms,記憶體約為 352 kB,通過測試。
#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n; cin >> n;  // 矩陣大小 n*n
    int mat[n][n];  // 讀取矩陣資料
    for(int r=0; r<n; r++) {
        for(int c=0; c<n; c++) cin >> mat[r][c];
    }
    int pool[n/2][n/2];  // 儲存最大池化的結果
    for(int r=0; r<n; r+=2) {  // 依序掃過第 0 ~ n-1 列,每次跳 2 列
        for(int c=0; c<n; c+=2) {  // 依序掃過第 0 ~ n-1 欄,每次跳 2 欄
            pool[r/2][c/2] = max(mat[r][c], max(mat[r][c+1], max(mat[r+1][c], mat[r+1][c+1])));  // 取 4 格中的最大值
        }
    }
    for(int r=0; r<n/2; r++) {  // 依序印出 pool 每列的資料
        for(int c=0; c<n/2; c++) {
            cout << pool[r][c] << " \n"[c == n/2 -1];
        }
    }
    return 0;
}

每讀取 2 列就輸出 1 次,使用時間約為 2 ms,記憶體約為 356 kB,通過測試。
#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n; cin >> n;  // 矩陣大小 n*n
    int row1[n], row2[n];  // 儲存 2 列矩陣資料
    for(int r=0; r<n; r+=2) {  // 依序掃過第 0 ~ n-1 列,每次跳 2 列
        for(int c=0; c<n; c++) cin >> row1[c];  // 讀取 2 列
        for(int c=0; c<n; c++) cin >> row2[c];
        for(int c=0; c<n; c+=2) {  // 依序掃過第 0 ~ n-1 欄,每次跳 2 欄
            cout << max(row1[c], max(row1[c+1], max(row2[c], row2[c+1]))) << " \n"[c == n-2];  // 取 4 格中的最大值
        }
    }
    return 0;
}


沒有留言:

張貼留言