문제) 백준 - 동적 계획법 1(Dynamic programming)- 01타일
-> www.acmicpc.net/problem/1904
dp | 가능한 숫자 | ||||
dp[1] | 1 | ||||
dp[2] | 11 | 00 | |||
dp[3] | 111 | 001 | 100 | ||
dp[4] | 1111 | 0011 | 1001 | 1100 | 0000 |
... | |||||
dp[n] | dp[n - 1] | ... | dp[n - 2] |
n을 숫자의 길이, dp[n]에 해당하는 값을 가능한 숫자의 개수라 하자.
'00' 타일과 '1' 타일을 붙이는데 별 다른 제약 조건이 없다. dp[n]은 dp[n - 2]에 '00' 타일을 붙여 만들 수 있고, dp[n - 1]에 '1' 타일을 붙여 만들 수 있다.
따라서 점화식을 다음과 같이 세울 수 있다.
dp[n] = dp[n - 1] + dp[n - 2]
모든 n에 대하여 점화식을 세웠으니, 초기값(dp[1], dp[2])만 설정하고 반복문을 실행하면 정답을 도출할 수 있다.
Python 소스 코드)
import sys
input = sys.stdin.readline
n = int(input())
dp = [0] * 1000001 # 1 <= n <= 1000000
dp[1] = 1
dp[2] = 2
for i in range(3, n + 1):
dp[i] = (dp[i-1] + dp[i-2]) % 15746
print(dp[n])
C++ 소스코드)
반응형
'PS(Problem Solving) > 백준_BOJ' 카테고리의 다른 글
[백준] 1890번 - 점프 (파이썬) 문제 및 풀이 (0) | 2021.03.09 |
---|---|
[백준] 1520번 - 내리막 길 (C++, 파이썬) 문제 및 풀이 (0) | 2021.03.09 |
[백준] 14502번 - 연구소 (파이썬) 문제 및 풀이 (0) | 2021.03.03 |
[백준] 11053번 - 가장 긴 증가하는 부분 수열 (파이썬) (0) | 2021.03.02 |
[백준] 2206번 - 벽 부수고 이동하기 (파이썬) (0) | 2021.03.01 |
댓글