Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

mo1lusca의 블로그

[백준] 9184 신나는 함수 실행 - C 본문

PS

[백준] 9184 신나는 함수 실행 - C

mo1lusca 2025. 5. 1. 11:40

 

 

https://www.acmicpc.net/problem/9184

 


 

문제에서 제시된 함수 w를 dp로 해결하면 되는 문제이다.

 

#include <stdio.h>

int dp[105][105][105];

int w(int a, int b, int c);

int main() {

	while (1) {
		int a, b, c;
		scanf("%d %d %d", &a, &b, &c);
		if (a == -1 && b == -1 && c == -1) {
			break;
		}
		printf("w(%d, %d, %d) = %d\n",a, b, c, w(a, b, c));
	}
	return 0;
}

int w(int a, int b, int c) {

	if (a <= 0 || b <= 0 || c <= 0) {
		return 1;
	}
	if (a > 20 || b > 20 || c > 20) {
		if (!dp[20][20][20]) {
			dp[20][20][20] = w(20, 20, 20);
		}
		return dp[20][20][20];
	}
	if (a < b && b < c) {
		if (!dp[a][b][c - 1]) {
			dp[a][b][c - 1] = w(a, b, c - 1);
		}
		if (!dp[a][b - 1][c - 1]) {
			dp[a][b - 1][c - 1] = w(a, b - 1, c - 1);
		}
		if (!dp[a][b - 1][c]) {
			dp[a][b - 1][c] = w(a, b - 1, c);
		}
		return dp[a][b][c - 1] + dp[a][b - 1][c - 1] - dp[a][b - 1][c];
	}
	if (!dp[a - 1][b][c]) {
		dp[a - 1][b][c] = w(a - 1, b, c);
	}
	if (!dp[a - 1][b - 1][c]) {
		dp[a - 1][b - 1][c] = w(a - 1, b - 1, c);
	}
	if (!dp[a - 1][b][c - 1]) {
		dp[a - 1][b][c - 1] = w(a - 1, b, c - 1);
	}
	if (!dp[a - 1][b - 1][c - 1]) {
		dp[a - 1][b - 1][c - 1] = w(a - 1, b - 1, c - 1);
	}
	return dp[a - 1][b][c] + dp[a - 1][b - 1][c] + dp[a - 1][b][c - 1] - dp[a - 1][b - 1][c - 1];
}

 

 

문제에서 제시된 함수 w를 간단히 메모이제이션 하였다.

 


'PS' 카테고리의 다른 글

[백준] 1978 소수 찾기 - Rust  (0) 2025.05.07
[백준] 1010 다리 놓기 - C  (0) 2025.05.02
[백준] 2447 별 찍기 - 10 - C  (0) 2025.05.01
[백준] 11729 하노이 탑 이동 순서 - C  (0) 2025.05.01
[백준] 1003 피보나치 함수 - C  (0) 2025.05.01