[C++]백준11057번 오르막 수

less than 1 minute read

오늘은 백준11057번 오르막 수 문제를 풀어보도록 하자.

전형적인 DP문제이다.

문제는 다음과 같다.

                               [접근법]

  1. 우선 dp[0][1] ~ dp[9][1]까지 1로 초기화 시켜줍니다. (모두 1가지 씩이므로)
  
  2. 생각해보면 dp[0][2]는 2자리 수이면서 처음에 0으로 시작하는 오르막 수이다. 00 ~ 09까지 있을 수 있고 이는 dp[0][1] ~ dp[9][1]을 
     모두 더해주면 된다. dp[1][2]는 2자리 수이면서 처음에 1로 시작하는 오르막 수이다. 11~19까지 있을 수 있고 dp[1][1] ~ dp[9][1]까지 
     더하면 된다. 이 쯤 하면 어느정도 점화식이 보일 것이다.
  
  3. 주의해야 할 점은 모듈러 연산이다. dp배열에 넣을 때 계속 10007로 나눈 나머지 값을 넣어주는 것과 답을 누적할 때도 10007을 계속
  나눈 나머지 값을 넣는다는 것을 주의하자.
                                     [코드]
#include <iostream>
using namespace std;

int dp[10][1001];
int N,result = 0;

int main() {
	cin >> N;

	for (int i = 0; i < 10; i++){
		dp[i][1] = 1;// Base
	}

	for (int i = 2; i <= 1000; i++) {//
		for (int j = 0; j < 10; j++) {
			for (int k = j; k < 10; k++) {
				dp[j][i] += dp[k][i - 1] % 10007;
			}
		}
	}
	for (int i = 0; i < 10; i++) {
		result += dp[i][N] % 10007;
		result %= 10007;
	}
	cout << result << '\n';
}