Algorithm/dynamic programming

[백준] 알고리즘 9184번 - 신나는 함수 실행 문제

낭강 2021. 3. 10. 15:58
문제

소스코드
#include <bits/stdc++.h>
using namespace std;
int dp[51][51][51];
int w(int x, int y, int z) {
	if (x <= 0 || y <= 0 || z <= 0) //재귀 탈출조건
		return 1;
	if (dp[x][y][z] != 0) //이미 계산한 값이면
		return dp[x][y][z];
	if (x > 20 || y > 20 || z > 20) {
		dp[x][y][z] = w(20, 20, 20);
		return dp[x][y][z];
	}
	else if (x < y && y < z) {
		dp[x][y][z] = w(x, y, z - 1) + w(x, y - 1, z - 1) - w(x, y - 1, z);
		return dp[x][y][z];
	}
	else {
		dp[x][y][z] = w(x - 1, y, z) + w(x - 1, y - 1, z) + w(x - 1, y, z - 1) - w(x - 1, y - 1, z - 1);
		return dp[x][y][z];
	}

}
int main(){
   ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
   while (1) {
	   int a, b, c;
	   cin >> a >> b >> c;
	   if (a == -1 && b == -1 && c == -1) break;
	   if (a < 0 || b < 0 || c < 0) {
		   cout << "w(" << a << ", " << b << ", " << c << ") = "  << 1 << "\n";
		   continue;
	   }
	   cout << "w(" << a << ", " << b << ", " << c << ") = " << w(a,b,c)<<"\n";
	    
   }
}
풀이

메모제이션 기법을 이용

문제에 나타나있는 조건대로 w함수를 작성

메모제이션 작성법

1. 재귀함수의 탈출문을 작성

2. 이미 방문한 dp면 즉 값이 초기화안된 값이 들어가져 있으면 이미 방문하였다는 거닌깐 그대로 사용