https://www.acmicpc.net/problem/2482
2482번: 색상환
첫째 줄에 N색상환에서 어떤 인접한 두 색도 동시에 선택하지 않고 K개의 색을 고를 수 있는 경우의 수를 1,000,000,003 (10억 3) 으로 나눈 나머지를 출력한다.
www.acmicpc.net
DP 문제다.
원형 칸에서 나란하지 않은 k개를 고르는 경우의 수를 구하는 문제다.
몇가지 계산하다보니 바로 규칙을 찾을 수 있었다.
행이 n, 열이 k일 때 아래와 같은 표를 그릴 수 있다.
| 1 | 2 | 3 | 4 | |
| 4 | 4 | 2 | 0 | 0 |
| 5 | 5 | 5 | 0 | 0 |
| 6 | 6 | 9 | 2 | 0 |
| 7 | 7 | 14 | 7 | 0 |
표를 통해 dp[i][j] = dp[j - 1][i] + dp[j - 2][i - 1]와 같은 점화식을 세울 수 있다.
#include <iostream>
using namespace std;
int n, m;
int dp[1001][1001];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) dp[i][1] = i;
for (int i = 2; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (j / 2 >= i) dp[j][i] = (dp[j - 1][i] + dp[j - 2][i - 1])%1000000003;
}
}
cout << dp[n][m];
}

'Algorithm > DP' 카테고리의 다른 글
| [C++] BOJ(백준) 3687 성냥개비 (0) | 2024.01.04 |
|---|---|
| [C++] BOJ(백준) 11066 파일 합치기 (0) | 2024.01.04 |
| [C++] BOJ(백준) 14846 직사각형과 쿼리 (0) | 2023.08.02 |
| [C++] BOJ(백준) 3114 사과와 바나나 (0) | 2023.07.31 |
| [C++] BOJ(백준) 1947 선물 전달 (0) | 2023.07.24 |