백준 15988번: 1, 2, 3 더하기 3 (C++)

2023. 1. 31. 21:00알고리즘/DP

https://www.acmicpc.net/problem/15988

 

15988번: 1, 2, 3 더하기 3

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다.

www.acmicpc.net

 

 

풀이

DP 문제 유형 까먹을 것 같아서 오랜만에 풀어봤다.

매번 하던 재귀 방식으로 구현 했다.

 

우선, cache 배열을 만들어서 ret 으로 참조하도록 했고, N == 0 이 될 때까지 1, 2, 3을 뺀 케이스를 재귀로 호출과 함께 ret 에 더해주었다.

 

사실 나도 반복학습으로 배운 방법이라 설명이 어렵다.

 

전체 코드

#include <iostream>
#include <string.h>
#include <algorithm>

using namespace std;

const int MOD = 1000000009;
int N, T;
long long cache[1000001];

long long dp(long long idx) {
	if (idx == 0) return 1;
	if (idx < 0) return 0;

	long long& ret = cache[idx];
	if (ret != -1) return ret % MOD;
	ret = 0;

	ret = dp(idx - 1) + dp(idx - 2) + dp(idx - 3);

	return ret %= MOD;
}


int main() {
	cin >> T;
	memset(cache, -1, sizeof(cache));

	while (T--) {
		cin >> N;
		cout << dp(N) % MOD << '\n';
	}

}

'알고리즘 > DP' 카테고리의 다른 글

백준 4811번: 알약 (C++)  (0) 2023.03.05