BAEKJOON

BAEKJOON 2482번: 색상환

杉山空 2021. 12. 21. 23:10
728x90

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

 

2482번: 색상환

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

www.acmicpc.net

D[i][j]={i개의 색 중, j개의 색 선택시 문제의 답} 이라고 정의하겠다.

 

D[i][j]를 점화식으로 표현하기 위해서

case1) i번째 색을 선택한다.

case2) i번째 색을 선택하지 않는다.

 

위와같이 케이스를 나누어서 생각했을때

D[i][j]= case1) + case2) 이다.

case1) 과 case2) 를 D로 나타내면 다음과 같다.

 

case1) D[i-2][j-1]

(i번째 색을 선택했으므로 i에 인접한 두 색을 선택할 수 없으며, 이미 i번째의 색 하나를 선택했기 때문에 j-1개 선택)

case2) D[i-1][j]

(i번째 색을 선택하지 않으며, j개의 색 선택)

 

따라서

D[i][j]=D[i-1][j]+D[i-2][j-1]

 

또한 i<j×2일 경우에 인접하지 않게 j개를 고르는 것은 불가능하다. 따라서 이러한 경우는 계산하지 않는다.

 

위 풀이를 구현한 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
#include <cstdio>
#define FOR(i,s,n) for(int i=s;i<=n;i++)
int D[1003][1003],N,K,m=1e9+3;
int main(){
    scanf("%d%d",&N,&K);
    FOR(i,0,N)D[i][1]=i;
    FOR(j,2,K)FOR(i,1,N)if(i>=j*2)D[i][j]=(D[i-1][j]+D[i-2][j-1])%m;
    printf("%d",D[N][K]);
    return 0;
}
cs

위 풀이의 경우 시간복잡도는 O(NK)이다.

728x90

'BAEKJOON' 카테고리의 다른 글

BAEKJOON 2252번: 줄세우기  (0) 2022.03.01
BAEKJOON 8913번: 문자열 뽑기  (0) 2022.02.26
BAEKJOON 9002번: Match Maker  (0) 2022.02.23
BAEKJOON 22345번: 누적거리  (0) 2022.02.09
BAEKJOON 2315번: 가로등 끄기  (0) 2021.12.20