문제

소스코드
#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면 즉 값이 초기화안된 값이 들어가져 있으면 이미 방문하였다는 거닌깐 그대로 사용
'Algorithm > dynamic programming' 카테고리의 다른 글
| [백준] 알고리즘 10844번 - 쉬운 계단 수 문제 (0) | 2021.03.17 |
|---|---|
| [백준] 알고리즘 1932번 - 정수 삼각형 문제 (0) | 2021.03.14 |
| [백준] 알고리즘 1149번 - RGB거리 문제 (0) | 2021.03.11 |
| [백준] 알고리즘 1904번 - 01타일 문제 (0) | 2021.03.10 |
| [백준] 알고리즘 1003번 - 피보나치 함수 문제 (0) | 2021.03.09 |
