본문 바로가기
알고리즘/BOJ

[Python] 백준 2482번: 색상환

by PIAI 2021. 10. 13.

https://www.acmicpc.net/problem/2482

 

2482번: 색상환

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

www.acmicpc.net

1. 처음과 마지막이 (0, 0), (0, 1), (1, 0), (1, 1) 일때로 나누었다.

(0, 0) 이면 dp[i][j-1]가 0으로 끝날때 + 0

(0, 1) 이면 dp[i-1][j-1]의 (0, 0)에 + 1, 

(1, 0) 이면 dp[i][j-1]가 1로 시작할때 + 0

(1, 1) 이면 dp[i-1][j-1]의 (1, 0)에 + 1

마지막에 (1, 1)인 경우만 제외하고 전부 더해준다.

import sys
input = sys.stdin.readline

mod = int(1e9+3)
n = int(input())
k = int(input())
dp = [[[0, 0, 0, 0] for _ in range(n+1)] for _ in range(k+1)]

for i in range(2, n+1):
    dp[1][i] = [i-2, 1, 1, 0]

for i in range(2, k+1):
    for j in range(i*2-1, n+1):
        dp[i][j][0] = (dp[i][j-1][1] + dp[i][j-1][0]) % mod
        dp[i][j][1] = dp[i-1][j-1][0] % mod
        dp[i][j][2] = (dp[i][j-1][2] + dp[i][j-1][3]) % mod
        dp[i][j][3] = dp[i-1][j-1][2] % mod

print(sum(dp[k][n][:3]) % mod)

댓글