728x90
반응형
14852번: 타일 채우기 3
첫째 줄에 경우의 수를 1,000,000,007로 나눈 나머지를 출력한다.
www.acmicpc.net
출처 : 백준
2×N 크기의 벽을 2×1, 1×2, 1×1 크기의 타일로 채우는 경우의 수를 구해보자.
import sys
sys.setrecursionlimit(10**6)
d = [0] * 1000001
def dp(n):
if n == 0 :
return 1
if n == 1:
return 2
if n == 2:
return 7
if (d[n]!=0):
return d[n]
result = 3 * dp(n-2) + 2* dp(n-1)
for i in range(3,n+1):
result += (2 * dp(n-i)) % 1000000007
d[n] = result
return d[n]
n = int(input())
print(dp(n))
답은 정확하게 나오는데 시간초과이다.
비정상적이고 비효율적이다.
=>2차원 다이나믹 프로그래밍
d = [[0]*2]* 1000001
def dp(n):
d[0][0] = 0
d[1][0] = 2
d[2][0] = 7
d[2][1] = 1
print(d[0][0])
for i in range(3,n+1):
d[i][1] = (d[i-1][1]+d[i-3][0]) % 1000000007
d[i][0] = (3 * d[i-2][0] + 2 * d[i-1][0] + 2 * d[i][1]) % 1000000007
return d[n][0]
n = 3
dp(n)
d = [[0]*2]* 1000001이렇게 선언하면 이상하게 나온다.
0으로 초기화했는데 7로 나와서 다음 과 같은 방식으로 list를 초기화해야 한다.
d = [[0]*2 for _ in range(1000001)]
def dp(n):
d[0][0] = 0
d[1][0] = 2
d[2][0] = 7
d[2][1] = 1
for i in range(3,n+1):
d[i][1] = (d[i-1][1]+d[i-3][0]) % 1000000007
d[i][0] = (3 * d[i-2][0] + 2 * d[i-1][0] + 2 * d[i][1]) % 1000000007
return d[n][0]
n = 3
dp(n)
반응형
'문제 > 백준' 카테고리의 다른 글
1001_A-B (0) | 2021.10.31 |
---|---|
1000_A+B (0) | 2021.10.31 |
2133_타일 채우기 (0) | 2021.09.27 |
11727_2×n 타일링 2 (0) | 2021.09.25 |
11726_2×n 타일링 (0) | 2021.09.25 |