Study hard

(c++)백준 10844번: 쉬운 계단 수 본문

백준/DP

(c++)백준 10844번: 쉬운 계단 수

Nimgnoej 2020. 6. 8. 21:07

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

 

10844번: 쉬운 계단 수

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

www.acmicpc.net

 

※점화식※

dp[i][j] : 길이가 i인 수의 i번째 자리에 j가 올 때 경우의 수

dp[1][1] ~ dp[1][9]까지 1로 초기화 해준다.

if(j==9) dp[i][j] = dp[i-1][j-1] (마지막 수가 9면 그 앞 숫자는 8만 올 수 있다.)

if(j==0) dp[i][j] = dp[i-1][j+1] (마지막 수가 0이면 그 앞 숫자는 1만 올 수 있다.)

else dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1] (0과 9 외의 수는 그 앞 숫자로 1 작거나 큰 수가 올 수 있다.)

 

#include <iostream>
using namespace std;
#define D 1000000000

int N;
int dp[101][10];

void DP() {
	dp[1][0] = 0;
	for (int i = 1; i <= 9; i++) {
		dp[1][i] = 1;
	}
	for (int i = 2; i <= N; i++) {
		for (int j = 0; j <= 9; j++) {
			//0이전에는 1만 올 수 있음
			if (j == 0)
				dp[i][j] = dp[i - 1][j + 1] % D;
			//9이전에는 8만 올 수 있음
			else if (j == 9)
				dp[i][j] = dp[i - 1][j - 1] % D;
			//아니면 1 크거나 1 작은 수가 옴
			else
				dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j + 1]) % D;
		}
	}
	long long res = 0;
	for (int i = 0; i <= 9; i++) {
		res += dp[N][i];
	}
	cout << res % D << endl;
}

int main() {
	cin >> N;
	DP();
	return 0;
}

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

(c++)백준 2193번: 이친수  (0) 2020.06.09
(c++)백준 11057번: 오르막 수  (0) 2020.06.08
(c++)백준 9095번: 1, 2, 3 더하기  (0) 2020.06.08
(c++)백준 11727번: 2xn 타일링 2  (0) 2020.06.08
(c++)백준 11726번: 2xn 타일링  (0) 2020.06.08