Algorithm/acmicpc.net

다이나믹 프로그래밍4

winney916 2021. 12. 13. 20:10
728x90

#10844 쉬운 계단 수 https://www.acmicpc.net/problem/10844

 

10844번: 쉬운 계단 수

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

 디피 문제를 풀다가 또 한번 막히셨단다... (지긋)

 

내가 생각한 점화식은 

약간 이런 느낌이었다.

 뭔가 야간 이런 느낌으로, 0, 9일 때는 하나씩 파생되고, 1~8일 때는 2개씩 파생되는 모양새가 다른 패턴이 있을 것 만 같은 느낌을 주긴 했다. 그래도 위에서 먼저 찾았던 점화식을 적용해 봤지만

 

당연히 틀림.

실버 1레벨의 문제니까 다르다 이건가

 

고민을 하던 끝에 검색을 했다.

n = int(input())

mod = 1000000000
dp = [[0 for x in range(10)] for y in range(101)]

for i in range(1, 10):
    dp[1][i] = 1

for i in range(2, n+1):
    for j in range(10):
        if j == 0:
            dp[i][j] = dp[i-1][1]
        elif j == 9:
            dp[i][j] = dp[i-1][8]
        else:
            dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]

print(sum(dp[n]) % mod)

dp 리스트를 보면 자리수를 거듭할 수록 1차원 index를 갖는다.

dp[0] -> 0의 자리 수 일 때의 계단수

dp[1] -> 1의 자리 수 일 때의 계단수

 

2차원 index는 각 인덱스를 숫자로 해석하면 된다

dp[1][0] -> 1의자리 수 일때 0이 갖는 계단수의 경우 -> 0가지

dp[1][1] -> 1의자리 수 일때 1이 갖는 계단수의 경우 -> 1가지

 

조금 난해할 수 있지만 저런 의미이다.

이걸 다이나믹 프로그래밍 방식으로 풀어나간다면 이렇게 된다.

 

약간 느낌이 올까..?

계단수라는건 '어떤 수'와 1차이 나는 수가 옆에 오는 경우를 말하는데

한 자리수가 늘어나는 상황에서 올 수 있는 경우의 수는

그 자리수 보다 작은 자리수에서 구해놓은 경우의 수 중,

'어떤 수' 보다 1차이 나는 자릿수가 갖고있는 경우의수를 모두 더해주면 된다.

그림상에서는 대각선 위에 있는 값을 가져와 더해주면 된다.

약간 감이 왔으면 좋겠다.

나도 처음 이해할 때는 이게 뭔가 싶었지만 알고보니 참 쉬워서 당황했다.

 

index 0의 경우에는 왼쪽 위가 없다.

index 9의 경우에는 오른쪽 위가 없다.

 

따라서 점화식은

0일 때, 9일 때, 1~8일 때로 나눠서 진행해주면 된다.

 

이후 각 숫자의 경우의 수를 모두 더해주면 해당 자리수의 경우의 수가 나온다.

 

'Algorithm > acmicpc.net' 카테고리의 다른 글

DP...  (0) 2021.12.16
다이나믹 프로그래밍5  (0) 2021.12.14
다이나믹 프로그래밍3  (0) 2021.12.10
다이나믹 프로그래밍2  (0) 2021.12.09
다이나믹 프로그래밍 (Dynamic Programming)  (0) 2021.12.08