[파이썬] 백준 18244 : 변형 계단 수 (골드3)
18244번: 변형 계단 수
첫째 줄에 정답을 1,000,000,007으로 나눈 나머지를 출력한다.
www.acmicpc.net
문제
풀이
0. 방향성 생각
- 상태가 5개로 나뉜다.
- 시작 상태 : 증감 구분이 안돼있음
- 1개 연속 증가 : 시작상태에서 오거나 감소상태에서 오는경우
- 2개 연속 증가 : 1개 연속 증가에서 또 증가
- 1개 연속 감소 : 시작상태에서 오거나 증가상태에서 오는경우
- 2개 연속 감소 : 2개 연속 감소에서 또 감소
1. 입력
n = int(input())
dp = [[[0]*10 for _ in range(n)] for _ in range(5)]
dp[0][0] = [1]*10
k = 10**9+7
# dp[state][stage][num]
2. DP 테이블 업데이트
for stage in range(n-1):
for state in range(5):
for num in range(10):
if 1<=state<=2 and 1<=num<=9: # 1~9는 0~8에서 증가
if state == 1:
for i in (0,3,4):
dp[1][stage+1][num] += dp[i][stage][num-1]%k
if state == 2:
dp[2][stage+1][num] += dp[1][stage][num-1]%k
if 3<=state<=4 and 0<=num<=8: # 0~8은 1~9에서 감소
if state == 3:
for i in (0,1,2):
dp[3][stage+1][num] += dp[i][stage][num+1]%k #
if state == 4:
dp[4][stage+1][num] += dp[3][stage][num+1]
print(sum(sum(dp[i][-1]) for i in range(5))%k)
- dp[state][stage][num]로 생각한다. state를 숫자로 바꿔서 생각하면
1은 0 3 4에서 오고
2는 1에서
3은 0 1 2에서오고
4는 3에서 오고
전체코드
n = int(input())
dp = [[[0]*10 for _ in range(n)] for _ in range(5)]
dp[0][0] = [1]*10
k = 10**9+7
for stage in range(n-1):
for state in range(5):
for num in range(10):
if 1<=state<=2 and 1<=num<=9:
if state == 1:
for i in (0,3,4):
dp[1][stage+1][num] += dp[i][stage][num-1]%k
if state == 2:
dp[2][stage+1][num] += dp[1][stage][num-1]%k
if 3<=state<=4 and 0<=num<=8:
if state == 3:
for i in (0,1,2):
dp[3][stage+1][num] += dp[i][stage][num+1]%k
if state == 4:
dp[4][stage+1][num] += dp[3][stage][num+1]
print(sum(sum(dp[i][-1]) for i in range(5))%k)
코멘트
계단수를 비트마스킹으로 접근 안한 사람이라면 난도 자체는 비슷하게 느껴질듯?
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[파이썬] 프로그래머스 : 도둑질 (Lv.4) (0) | 2023.11.23 |
---|---|
[파이썬] 프로그래머스 : 스티커 모으기 2 (Lv.3) (0) | 2023.11.23 |
[파이썬] 백준 10844 : 쉬운 계단 수 (실버1) (0) | 2023.11.23 |
[파이썬] 백준 1636 : 한번 열면 멈출 수 없어 (골드4) (0) | 2023.11.05 |
[파이썬] 백준 14550 : 마리오 파티 (골드5) (0) | 2023.10.22 |
[파이썬] 백준 2193 : 이친수 (실버3) (0) | 2023.10.12 |
[파이썬] 백준 1577 : 도로의 개수 (골드5) (0) | 2023.09.29 |
댓글