문제링크
https://www.acmicpc.net/problem/10844
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import sys
input = sys.stdin.readline
n = int(input())
d = [[0]*10 for _ in range(101)]
d[1] = [0,1,1,1,1,1,1,1,1,1]
for i in range(2,n+1):
for j in range(0,10):
if j ==0:
d[i][j] = d[i-1][j+1]
elif j==9:
d[i][j] = d[i-1][j-1]
else:
d[i][j] = d[i-1][j-1] + d[i-1][j+1]
print( sum(d[n])%1000000000 )
|
cs |
POINT
- DP로 접근
- 풀이방법:
1 차이 나는 수를 연속으로 배치하기 위해서 마지막 수를 저장하고 있어야 한다.
n번째에서 할 수 있는 행동: +0, +1, +2, ... ,+9 추가하기
단 이때, 직전 숫자가 지금 추가할 수와 1 차이가 날 때에만 해당 수를 추가할 수 있다. (by 문제의 '계단수' 정의)
이를 구현하기 위해서 2차원 배열 d[i][j] 생성
d[i][j] = '총 길이가 i이고 맨 마지막 수가 j인 계단수 갯수' 라고 정의
ex) d[2][3] : 총 길이 2이고, 맨 마지막 수가 3인 계단 수 갯수 --> {2,3}, {4,3} 가 가능하므로, d[2][3]=2
d[i][j] = d[i-1][j-1] + d[i-1][j+1]와 같은 방식으로 저장해나간다.
단, 마지막 수(=j) 가 0일 때, j-1 = 0-1=-1 이므로 배제하고,
마지막 수가 9 일 때에는 j+1 = 9+1 =10 이 되므로 이 경우도 제외한다.
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준]11053 가장 긴 증가하는 부분 수열 14002 가장 긴 증가하는 부분 수열 4 파이썬 얕은 복사 python (0) | 2022.02.09 |
---|---|
[백준]2193 이친수 파이썬 python (0) | 2022.02.09 |
[백준]15990 1, 2, 3더하기 5 파이썬 python (0) | 2022.02.07 |
[백준]11052 카드구매하기 16194 카드구매하기2 파이썬 python (0) | 2022.02.06 |
[백준]9095 1, 2, 3 더하기 파이썬 python (0) | 2022.02.05 |