[문제 링크]

 

9184번: 신나는 함수 실행

입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다.

www.acmicpc.net


문제에서 요구하는 조건대로 구현해주면 되는 문제였다.

입력으로 주어지는 정수의 최솟값이 -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

+ Recent posts