백준 문제풀이
백준 11574 - CYK의 너무너무 재밌는 그래프 만들기 놀이 [Python]
Vermeil
2021. 7. 1. 15:32
https://www.acmicpc.net/problem/11574
11574번: CYK의 너무너무 재밌는 그래프 만들기 놀이
N (1 ≤ N ≤ 100)개의 정점의 개수가 주어지고, K (1 ≤ K ≤ 3)개의 가능한 색깔이 주어진다. 각 정점들을 1 부터 N까지 차례로 번호를 매기고, 그 정점들에 K개의 색깔중 하나를 임의로 부여한다.
www.acmicpc.net
간단한 DP
k = 1일때
무조건 1가지이다.
k = 2일때
맨 뒤에 색 1 추가, 혹은 색 2를 추가하는 경우가 있다.
\(dp[n][k] = n번째에서 색 1을 k개 사용하였을 때, 경우의 수\) 라고 하자.
색 1을 붙일 때:
간선을 잇는 경우는 색 2의 개수이고, 잇지 않는 경우는 1가지이므로,
\(dp[n - 1][k - 1] * (n - k + 1)\)
색 2를 붙일 때:
간선을 잇는 경우는 색 1의 개수이고, 잇지 않는 경우는 1가지이므로,
\(dp[n - 1][k] * (k + 1)\)
이 둘을 더한 값이 \(dp[n][k]\)의 값이다.
k = 3일때
앞서 설명한대로 하면 됨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
############### Main! ###############
MAX = 105
MOD = 1000000007
dp1 = [[0 for _ in range(MAX)] for _ in range(MAX)]
dp2 = [[[0 for _ in range(MAX)] for _ in range(MAX)] for _ in range(MAX)]
dp1[0][0] = 1
dp2[0][0][0] = 1
n, k = map(int, input().split())
if k == 1:
print(1)
exit()
ans = 0
if k == 2:
for i in range(1, n + 1):
for j in range(i + 1):
dp1[i][j] += dp1[i - 1][j - 1] * (i - j + 1) # col 1
dp1[i][j] += dp1[i - 1][j] * (j + 1) # col 2
dp1[i][j] %= MOD
print(sum(dp1[n]) % MOD)
exit()
for i in range(1, n + 1):
for j in range(i + 1):
for c in range(i - j + 1):
dp2[i][j][c] += dp2[i - 1][j - 1][c] * (i - j + 1) # col 1
dp2[i][j][c] += dp2[i - 1][j][c - 1] * (i - c + 1) # col 2
dp2[i][j][c] += dp2[i - 1][j][c] * (j + c + 1) # col 3
dp2[i][j][c] %= MOD
for j in range(n + 1):
ans += sum(dp2[n][j]) % MOD
ans %= MOD
print(ans % MOD)
######## Priest W_NotFoundGD ########
|
cs |
k=1일때 n출력해서 엄청틀렸다
dp테이블 하나로도 짤수 있더라,,