# Greedy# Array# Simulation

e798 - p5. 卷積神經網路

🔗 前往 ZeroJudge 原題

題目描述

題目要求實作一個 2x2 最大池化演算法,輸入一個 n x n 的二維陣列,輸出池化後的結果。池化操作將輸入陣列劃分為若干個 2x2 的子區域,並輸出每個子區域的最大值。

解題思路

程式碼直接模擬了最大池化操作。它遍歷輸入陣列,每次處理一個 2x2 的子區域。在每個子區域中,它比較四個元素的值,並將最大值賦給對應位置的輸出陣列。由於題目要求輸出的是池化後的結果,程式碼只輸出了子區域左上角元素的結果。程式碼使用異或運算來交換數值,以找到每個 2x2 區域的最大值。

複雜度分析

  • 時間複雜度: O(n^2)
  • 空間複雜度: O(1)

程式碼

#include <stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	int a[n][n];
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			scanf("%d",&a[i][j]);
	for(int i=0;i<n;i+=2){
		for(int j=0;j<n;j+=2){
			if(a[i][j]<a[i+1][j]){
				a[i][j]^=a[i+1][j];
				a[i+1][j]^=a[i][j];
				a[i][j]^=a[i+1][j];
			}
			if(a[i][j]<a[i][j+1]){
				a[i][j]^=a[i][j+1];
				a[i][j+1]^=a[i][j];
				a[i][j]^=a[i][j+1];
			}
			if(a[i][j]<a[i+1][j+1]){
				a[i][j]^=a[i+1][j+1];
				a[i+1][j+1]^=a[i][j];
				a[i][j]^=a[i+1][j+1];
			}
		}
	}
	for(int i=0;i<n;i+=2){
		for(int j=0;j<n;j+=2)
			printf("%d ",a[i][j]);
		printf("\n");
	}
}

Discussion