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]);
}
}
'알고리즘 문제' 카테고리의 다른 글
[C/C++ 백준 1932번] 정수 삼각형 (Silver 1) (0) | 2020.05.19 |
---|---|
[C/C++ 백준 2302번] 극장좌석 (Silver 2) (0) | 2020.05.17 |
[C/C++ 백준 11060번] 점프 점프 (Silver 2) (0) | 2020.05.17 |
[C/C++ 백준 9251번] LCS (Gold 5) (0) | 2020.05.17 |
[C/C++ 백준 10164번] 격자상의 경로 (Silver 1) (0) | 2020.05.16 |