문제에서 요구하는 조건대로 구현해주면 되는 문제였다.
입력으로 주어지는 정수의 최솟값이 -50 이므로, 음수까지 메모이제이션 하기 위해 값에 50을 더해줬다.
또한 a, b, c 셋 중에 하나라도 20을 넘는 값이 있을 경우 w(20, 20, 20)으로 재귀 호출 하기 때문에, memo 배열의 최대 크기를 101이 아닌 71로 선언하여 공간 복잡도를 줄였다.
#include <iostream>
using namespace std;
const int INF = 987654321;
int memo[71][71][71];
int dp(int a, int b, int c) {
if (a <= 0 || b <= 0 || c <= 0) return 1;
else if (a > 20 || b > 20 || c > 20) return dp(20, 20, 20);
int& ret = memo[a+50][b+50][c+50];
if (ret != 0)
return ret;
if (a < b && b < c)
return ret = dp(a, b, c - 1) + dp(a, b - 1, c - 1) - dp(a, b - 1, c);
else
return ret = dp(a - 1, b, c) + dp(a - 1, b - 1, c) + dp(a - 1, b, c - 1) - dp(a - 1, b - 1, c - 1);
}
int main(void) {
cin.tie(0);
ios_base::sync_with_stdio(0);
while (true) {
int a, b, c;
cin >> a >> b >> c;
if (a == -1 && b == -1 && c == -1)
break;
else {
cout << "w(" << a << ", " << b << ", " << c << ") = " << dp(a,b,c) << '\n';
}
}
return 0;
}
'알고리즘 > BOJ' 카테고리의 다른 글
백준 7576번: 토마토 (0) | 2022.10.15 |
---|---|
백준 1012번: 유기농 배추 (0) | 2022.10.14 |
백준 11660번: 구간 합 구하기 5 (0) | 2022.10.14 |
백준 2839번: 설탕 배달 (0) | 2022.10.14 |
백준 1662번: 압축 (0) | 2021.10.23 |