반응형
https://www.acmicpc.net/problem/9184
이미 연산했던 결과는 메모이제이션 해줍니다.
입력되는 값의 범위는 -50 이상 50 이하이지만,
하나라도 0 미만이거나 20 초과일 경우 1 또는 w(20, 20, 20)을 리턴하므로,
dp[0~20][0~20][0~20]인 값만 기억해두면 됩니다.
#include <cstdio>
int dp[21][21][21] = { 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) return dp[20][20][20] = w(20, 20, 20);
int& ret = dp[a][b][c];
if (ret != 0) return ret;
if (a < b && b < c) return ret = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
return ret = w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
}
int main() {
int a, b, c;
while (1) {
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));
}
}
반응형
'Algorithm' 카테고리의 다른 글
백준 1311 : 할 일 정하기 1 (0) | 2021.11.18 |
---|---|
백준 1477 : 휴게소 세우기 (0) | 2021.11.18 |
백준 1932 : 정수 삼각형 (0) | 2021.11.18 |
백준 1949 : 우수 마을 (0) | 2021.11.18 |
백준 2213 : 트리의 독립집합 (0) | 2021.11.18 |