[10844] 쉬운 계단 수

less than 1 minute read

풀이

1차원 dp로는 풀지 못했습니다. dp[i][j]를 길이가 i이고 마지막 숫자가 j인 계단 수라고 정의합니다.

마지막 숫자가 1~8일 때는 다음 숫자를 2개 적을 수 있지만(마지막 수 = 마지막 수 +- 1), 마지막 숫자가 0 또는 9일 때는 두 개를 적을 수 없습니다. 따라서 이것을 분기 해주기 위해서 2차원 dp표를 사용합니다.

코드

#include <iostream>

int dp[101][10];
int n,t;

int main(void) {
	scanf("%d", &n);
	for (int i = 1; i < 10; i++) {
		dp[1][i] = 1;
	}
	for (int j = 2; j <= n; j++) {
		for (int k = 0; k < 10; k++) {
			if (k == 0) {
				dp[j][k] = dp[j - 1][k + 1];
			}else if (k == 9) {
				dp[j][k] = dp[j - 1][k - 1];
			}
			else {
				dp[j][k] = dp[j - 1][k - 1] + dp[j - 1][k + 1];
			}
			dp[j][k] %= 1000000000;
		}
	}
	long long ans = 0;
	for (int i = 0; i < 10; i++) {
		ans += dp[n][i];
		ans %= 1000000000;
	}
	printf("%lld\n", ans);
	return 0;
}

Tags:

Categories:

Updated: