본문 바로가기
Algorithm/BOJ

[BOJ/C++]11057번 오르막 수

by DEV Lee 2020. 7. 29.

https://www.acmicpc.net/problem/11057

 

11057번: 오르막 수

오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수�

www.acmicpc.net


문제

'2234', '3678', '11119'와 같이 인접한 수가 같거나 오름차순인 수를 "오르막 수"라고 한다.

n길이의 오르막 수 개수를 구해라.

 

풀이방법

https://lionontheshore.tistory.com/33?category=929275

 

[BOJ/C++]10844 번 쉬운 계단 수

https://www.acmicpc.net/problem/10844 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 문제 계단 수는 '45656'과 같이 인접한 모든 자리 수가 1씩 차이나..

lionontheshore.tistory.com

와 같은 방식으로 풀었다.

다만, 오르막 수의 경우는 [i][j]에서 j보다 작은 모든 수를 더해야 하기 때문에

먼저 dp[i][0]=dp[i-1][0]으로 정의해주고(0은 뒤에 0밖에 갖기 못하기 때문에)

 dp[i][j]=dp[i][j-1]+dp[i-1][j-1]로 점화식을 구해주었다.

예를 들면 j=1인 경우에

 dp[i][1]=dp[i][0]+dp[i-1][1]=dp[i-1][0]+dp[i-1][1]이고,

j=2

 dp[i][2]=dp[i][1]+dp[i-1][2]=dp[i-1][0]+dp[i-1][1]+dp[i-1][2]

와 같이 j아래 모든 수를 더해줄 수 있다.

 

 

소스코드

#include<iostream>
using namespace std;

int main(void){
    int n;cin>>n;
    int dp[n+1][10];

    for(int i=0;i<10;i++)
        dp[1][i]=1;
    
    for(int i=2;i<=n;i++){
        dp[i][0]=dp[i-1][0];
        for(int j=1;j<10;j++)
            dp[i][j]=(dp[i][j-1]+dp[i-1][j])%10007;
    }

    int sum=0;
    for(int i=0;i<10;i++)
        sum=(sum+dp[n][i])%10007;
    cout<<sum<<endl;
}

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ/C++]9465번 스티커  (0) 2020.07.29
[BOJ/C++]2193번 이천수  (0) 2020.07.29
[BOJ/C++]10844 번 쉬운 계단 수  (0) 2020.07.29
[BOJ/C++]9095번 1,2,3 더하기  (0) 2020.07.29
[BOJ/C++]11727번 2xn타일링 2  (0) 2020.07.28

댓글