t_바닥공사_223

source github.com/ndb796/python-for-coding-test
type 📌 개발노트
topics 600-알고리즘 & 코딩테스트 603 동적프로그래밍
types 문제풀이

문제

바닥을 덮개로 채워야한다. 가로 N, 세로 2이다.
덮개는 (1,2) , (2,1) , (2, 2) 의 크기를 가지고 있다.
바닥을 채우는 모든 경우의 수를 구하시오
(2,2) = (1,2) * 2 or (2,1) * 2

틀렸던 생각

2,2 로 다 채우고 나머지는 1,2 로 매꾼다
2,2 를 변형할 수 있는 다른 덮개로 바꾸는 경우를 샌다
==> 수학적으로 풀면 풀수 있을 듯하지만… 일단 못풀고 시험당일날 생각하기는 어려움

옳은 답
이미 다채워져 있고 나머지를 채운다는 식으로 접근을 한다
하나남았을땐 1,2 인 직사각형
2개 남았을 땐 1,2인거 두개 2,1인거 두개 2,2인거 하나 넣는 경우의수 3개가 존재한다.
하지만 1,2인가 두개인경우는 하나남았을때를 두번 반복한것과 겹친다.
고로 빼줘야한다.
Therefore , 1 남았을 경우 1개 {(1,2)} , 2개 남았을 경우 2개 {(2,1),(2,2)}
$A_i = A_{i-1} + A_{i-2} \times 2$
이런식으로 된다.

탑다운 형식

row = int(input.strip())

# <span id="a1-1-a2-3"></span>a1 = 1 a2 = 3

def search(i):
    if i == 1 :
        return 1 
    if i == 2 :
        return 3
    return search(i-1) + search(i-2)*2

print(search(row)%796796)

보텀업 형식

# <span id="앞서-계산된-결과를-저장하기-위한-dp-테이블-초기화-"></span>앞서 계산된 결과를 저장하기 위한 DP 테이블 초기화 
n = int(input.strip())

d = [0] * 1001
 
d[1] = 1 
d[2] = 3 

for i in range(3, n + 1):
    d[i] = (d[i - 1] + 2 * d[i - 2]) % 796796

print(d[n])

수가 매우 커지면 탑다운 형식은 메모리 문제가 생기기 쉽다. 재귀는 깊이 제한이 있기 때무네