문제 : https://www.acmicpc.net/problem/15989


[ 알고리즘풀이 ]

DP[0][N] : N을 1을 무조건 한 번 이상 사용하면서 만드는 경우의 수.

DP[1][N] : N을 1을 사용 안하고, 2를 무조건 한 번 이상 사용하면서 만드는 경우의 수.

DP[2][N] : N을 1, 2를 사용 안하고 3을 무조건 한 번 이상 사용하면서 만드는 경우의 수.

→ DP[0][N] = DP[0][N - 1] + DP[1][N - 1]+ DP[2][N - 1];

→ DP[1][N] = DP[1][N - 2] + DP[2][N - 2];

→ DP[2][N] = DP[2][N - 3];

#include<iostream>

using namespace std;

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int T, N, dp[3][10001] = {};
	dp[0][1] = 1, dp[0][2] = 1, dp[1][2] = 1, dp[0][3] = 2, dp[2][3] = 1;
	for (int i = 4; i <= 10000; i++) {
		dp[0][i] = (dp[0][i - 1] + dp[1][i - 1] + dp[2][i - 1]);
		dp[1][i] = (dp[1][i - 2] + dp[2][i - 2]);
		dp[2][i] = dp[2][i - 3];
	}
	cin >> T;
	while (T--) {
		cin >> N;
		cout << dp[0][N] + dp[1][N] + dp[2][N] << '\n';
	}
}

 

+ Recent posts