반응형

문제링크:www.acmicpc.net/problem/2482

 

2482번: 색상환

첫째 줄에 N색상환에서 어떤 인접한 두 색도 동시에 선택하지 않고 K개의 색을 고를 수 있는 경우의 수를 1,000,000,003 (10억 3) 으로 나눈 나머지를 출력한다.

www.acmicpc.net

 

dp문제입니다. 점화식을 생각하는데 오래 걸렸습니다.

 

인접하게 칠할 수 없다는 조건이 있습니다.

 

dp[N][K] = N 개 짜리 색에서 K 개를 인접하지 않게 칠하는 경우의 수

 

점화식 : dp[n][k] = dp[n-2][k-1] + dp[n-1][k] 

 

 

표를 작성하면서 해당 점화식 규칙을 알게 되었습니다. 두개이상의 색을 구할때는 색칠한 경우와 하지 않은 경우로 구분하여 생각하면 됩니다. 

 

아래는 정답코드입니다.

#include <iostream>
using namespace std;

int dp[1001][1001] = { 0 };
int n = 0, k = 0;
int result = 0;

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(0);

	cin >> n >> k;

	for (int i = 1; i <= n; i++) {
		dp[i][1] = i;
		for (int j = 2; j <= i / 2; j++) {
			dp[i][j] = (dp[i - 1][j] + dp[i - 2][j - 1]) % 1000000003;
		}
	}
	/*
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= 3; j++)
			cout << dp[i][j] << ' ';
		cout << endl;
	}*/
	result = dp[n][k];
	cout << result << endl;

	return 0;
}

 

반응형

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

[백준] 11062-카드 게임(C++)  (0) 2020.12.16
[백준] 1516-게임개발(C++)  (0) 2020.12.16
[백준] 2056-작업(C++)  (0) 2020.12.15
[백준] 1256-사전(C++)  (0) 2020.09.13
[백준] 13398-연속합2(C++)  (0) 2020.09.06

+ Recent posts