본문 바로가기

Coding/백준

10844번 쉬운 계단 수

일단 N=1일 경우 1층부터 9층까지 9개가 존재한다.

 

N=2일 경우 0층으로 갈 수 있는 경우는 그 전 1층에서 가는 경우밖에 없다.

                   9층으로 갈 수 있는 경우는 그 전 8층에서 가는 경우밖에 없다.

                   1층에서 8층으로 갈 수 있는 경우는 그 전 층의 +1, -1층 즉, 2가지 경우가 있다.

 

따라서 N 길이를 가려고 했을 때 F[n][0] = F[n-1][1]

                                           F[n][9] = F[n-1][8]

                                           F[n][1] = F[n-1][0] + F[n-1][2]

                                           .....

                                           ...

                                           ..

                                           F[n][8] = F[n-1][7] + F[n-1][9]

 

층수를 J라고 하면 F[n][j] = F[n-1][j-1] + F[n-1][j+1] 이 식이 성립하게 된다.

 

ps. N=2일 경우 1층으로 가는 경우는 전 0층과 2층인데 0층에서 시작을 할 수 없다. 그래서 따로 2층인 경우를 나누려고 했으나 N=1일 때 0층의 값이 0이기 때문에 할 필요가 없었다.

 


#include <iostream>
#define MAX 101
#define mod 1000000000
using namespace std;

long long dp[MAX][10];

long long stair(int num){
    int sum=0;
    
    for(int j=1;j<=9;j++){
        dp[1][j]=1;
    }
    
    for(int i=2;i<=num;i++){
        dp[i][0]=dp[i-1][1]%mod;
        dp[i][9]=dp[i-1][8]%mod;
        for(int j=1;j<=8;j++){
            dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1]%mod;
        }
    }
    
    for(int i=0;i<=9;i++){
        sum=(sum+dp[num][i])%mod;
    }
    
    return sum%mod;
}
int main(){
    int num;
    cin >> num;
    cout << stair(num) << endl;
}

'Coding > 백준' 카테고리의 다른 글

2156번 포도주 시식  (0) 2019.09.09
2606번 바이러스  (0) 2019.09.09
3187번 양치기 꿍  (0) 2019.09.06
1003번 피보나치 함수  (0) 2019.09.03
14502번 연구소  (0) 2019.09.03