728x90
풀이
DP문제 중 계단 오르기와 더불어 기초에 해당하는 문제인데, 점화식을 찾지 못하면 좀 어려울 수도 있는 문제이다.
DP의 핵심은 우선 부분해를 구한 뒤 그것을 일반화하는 것이라고 생각한다. 그래서, 우선 쉽게 구할 수 있는 2*1과 2*2 각각을 구한 뒤에 3부터 일반화하여 구했다.
한번 생각해보자. 2 * 3의 바닥을 채우는 방법은 2 * 2의 바닥을 채우는 방법(2*1 2개, 1*2 2개, 2*2 1개 해서 총 3가지)에서 옆으로 1*2의 칸이 더 추가가 된 것이다. 이는 즉, (2 * 2의 바닥 채우기 + 1 * 2의 바닥 채우기) 순서와 (1 * 2의 바닥 채우기 + 2 * 2의 바닥 채우기) 순서를 합한 것이 총 2 * 3의 바닥을 채우는 방법이 되는 것이다.
이것을 일반화하면 i-2번째 줄 타일까지 다 채워져 있는 상황과 i-1번째 줄 타일까지 다 채워져 있는 상황을 생각하면 된다.
위 사진을 도식화하면..
dp = [0] * 1001
dp[1] = 1
dp[2] = 3
for i in range(3, n+1):
dp[i] = dp[i-1] + 2 * (dp[i-2])
이 된다.
'CS > 알고리즘' 카테고리의 다른 글
[Python] 백준(BOJ) 11053번 - 가장 긴 증가하는 부분 수열 (0) | 2021.08.03 |
---|---|
[Python] BOJ(백준) 14501번 - 퇴사 (0) | 2021.08.02 |
[Python] BOJ(백준) 1463번 - 1로 만들기 (0) | 2021.07.31 |
[Python] BOJ(백준) 1300번 - K번째 수 (0) | 2021.07.28 |
[Python] BOJ(백준) 2470번 - 두 용액 (0) | 2021.07.27 |