판다꼬마 2022. 7. 21. 17:55
728x90

문제

 

 

입력

  • 첫째 줄에 N이 주어진다. (1 <= N <= 1000)

 

 

출력

  • 첫째 줄에 2* N 크기의 바닥을 채우는 방법의 수를 796796으로 나눈 나머지를 출력한다.

 

입력 예시

3

출력 예시

5

풀이 방법

d[1] 일 때는  2*1 타일을 놓는 방법이 1개

d [2] 일 때는 2*1 타일을 놓는 방법이 3개이다.

그리고 그림을 그려서 하나하나 보면

d [i-1]까지 타일이 놓였을 때는 2*1 놓는 법이 1개

d [i-2]까지 타일이 놓였을 때는 2개이다.

 

그래서 점화식이 d [i]= d [i-1]+ d [i-2]*2이다

내 코드

n=int(input())

d=[0 for _ in range(n+1)]

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

Solution

# 정수 N을 입력 받기
n = int(input())

# 앞서 계산된 결과를 저장하기 위한 DP 테이블 초기화
d = [0] * 1001

# 다이나믹 프로그래밍(Dynamic Programming) 진행 (보텀업)
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])

느낀 점

다이나믹 프로그래밍 문제는 그림으로 그려서 풀면 조금 쉬워지는 것 같다.

728x90