Algorithm
[DP/ C++] BOJ 2482 색상환
도라프
2023. 2. 18. 19:32
문제
문제 접근
우선 색상환의 개수를 dp에 사용할 수 있겠다는 생각을 했다. 그래서 dp 2차원 배열에서 dp[N][k]라고 생각해서 설계했다.
조합을 사용하는 풀이처럼 느껴져서 배낭문제와 비슷하게 풀이를 해야겠다고 생각을 했고, 경우를 두가지로 나눠서 생각했다.,
1) N번째 색을 택하는 경우
N번째 색을 택하면 N-1번째 색은 택할 수가 없다. 따라서 N-2개 색 중 K-1개 색을 택하는 경우와 같다.
= dp[N-2][k-1]
2) N번째 색을 택하지 않는 경우
이 방법은 N-1개의 색에서 k개의 색을 택하는 경우와 같다.
= dp[N-1][k]
따라서 dp[N][k] = dp[N-2][k-1] + dp[N-1][k] 이다.
정답 코드
#include <iostream>
#define mod 1000000003
using namespace std;
int dp[1003][1003];
int main(void) {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, k;
cin >> N >> k;
for (int i = 0; i <= N; i++) {
dp[i][1] = i;
dp[i][0] = 1;
}
dp[2][2] = 0;
for (int i = 4; i <= N; i++) {
for (int j = 2; j <= k; j++) {
dp[i][j] = (dp[i - 2][j - 1] + dp[i - 1][j]) % mod;
}
}
cout << dp[N][k];
return 0;
}