본문 바로가기

알고리즘 문제

[C/C++ 백준 9184번] 신나는 함수 실행 (Silver 2)

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

 

9184번: 신나는 함수 실행

문제 재귀 호출만 생각하면 신이 난다! 아닌가요? 다음과 같은 재귀함수 w(a, b, c)가 있다. if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns: 1 if a > 20 or b > 20 or c > 20, then w(a, b, c) returns: w(20, 20, 20) if a < b a

www.acmicpc.net

너무 길어져서 비호감인 문제. 주어진 조건을 순서대로 생각하기만 해주면 풀수 있다. 범위가 적기 때문에 dp[21][21][21]로 3차원 배열을 사용해도 풀 수 있다. 문제에 있는 점화식만 잘 맞춰주자.

 

#include <cstdio>
int main(void){
	int a,b,c;
	int dp[21][21][21]={};
	for(int i=0; i<21; i++){
		for(int j=0; j<21; j++){
			for(int k=0; k<21; k++){
				if((i<=0 || j<=0) || k<=0)
					dp[i][j][k]=1;
				else if(i<j && j<k)
					dp[i][j][k]=dp[i][j][k-1]+dp[i][j-1][k-1]-dp[i][j-1][k];
				else
					dp[i][j][k]=dp[i-1][j][k]+dp[i-1][j-1][k]+dp[i-1][j][k-1]-dp[i-1][j-1][k-1];
			}
		}
	}
	while(1){
		scanf("%d %d %d", &a, &b, &c);
		if(a==-1 && b==-1 && c==-1)
			break;
		else if(a<=0 || b<=0 || c<=0)
			printf("w(%d, %d, %d) = 1\n",a,b,c);
		else if(a>20 || b>20 || c>20)
			printf("w(%d, %d, %d) = %d\n",a,b,c,dp[20][20][20]);
		else
			printf("w(%d, %d, %d) = %d\n",a,b,c,dp[a][b][c]);
	}
}