https://www.acmicpc.net/problem/2133
2133번: 타일 채우기
3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자.
www.acmicpc.net
풀이 과정
https://greentea31.tistory.com/26
백준 11726 - 2xn 타일링 [파이썬]
https://www.acmicpc.net/problem/11726 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지..
greentea31.tistory.com
위와 비슷하게 DP로 풀기 위해 점화식을 세워서 문제를 해결할 수 있다.
문제를 보고 생각을 하다보면 3x2 블록을 채우는 경우의 수는 3개가 있으니 3x4는 3x2 블록 2개 붙이면 되겠고... 이런 생각이 들겠지만 밑에 힌트를 보면 3x2 블록 채우는 경우의 수를 2개 조합한게 아닌 3x4 블록을 채우는 방법이 존재함을 알게 된다.
3xi 에서 i가 2씩 늘어날 수록 기존의 방법의 조합이 아닌 새로운 방법이 2개씩 더 추가된다.
따라서 d[i]를 3xi 블록을 채우는 방법의 경우의 수라고 하면
d[i] = 3 * d[i-2] + 2 * d[i-4] + 2 * d[i-6] + ... + 2 * d[0]이 성립한다.
d[0]은 1로 초기값을 설정해놔야 정답을 얻을 수 있다.
소스 코드
import sys
N = int(sys.stdin.readline())
d = [1, 0, 3, 0, 11]
for i in range(5, 31):
d.append(3*d[i-2])
for j in range(4, i+1, 2):
d[i] += 2*d[i-j]
print(d[N])
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 1260 - DFS와 BFS [파이썬] (0) | 2022.06.27 |
---|---|
백준 2309 - 일곱 난쟁이 [파이썬] (0) | 2022.05.26 |
백준 13398 - 연속합 2 [파이썬] (0) | 2022.05.26 |
백준 11054 - 가장 긴 바이토닉 부분 수열 [파이썬] (0) | 2022.05.26 |
백준 11722 - 가장 긴 감소하는 부분 수열 [파이썬] (0) | 2022.05.26 |