문제
https://www.acmicpc.net/problem/10844
10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
풀이
- D[N][H] : 길이가 N인 계단에서 H 높이로 종료되는 계단 수를 만들 수 있는 경우의 수
- (H = 0) D[i][H] = D[i - 1][H + 1]
- (H = 9) D[i][H] = D[i - 1][H - 1]
- (H = 1 ~ 8) D[i][H] = D[i - 1][H - 1] + D[i - 1][H + 1]
동적 계획법(Dynamic Programming) 알고리즘
동적 계획법(Dynamic Programming) 알고리즘
동적 계획법(Dynamic Programming) 알고리즘 한 번 해결된 부분 문제의 정답을 메모리에 기록하여, 한 번 계산한 답은 다시 계산하지 않도록 하는 문제 해결 기법 동적 계획법 알고리즘 핵심 이론 1. 큰
soobin0821.tistory.com
코드
#include <iostream>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
vector<vector<long>> count(N + 1, vector<long> (10, 0));
// 0으로 숫자가 시작할 수 없으므로 D[0][1]은 0으로 초기화
for(int i = 1; i <= 9; i++)
{
count[1][i] = 1;
}
for(int i = 2; i <= N; i++)
{
count[i][0] = count[i - 1][1]; // N에서 높이가 0이면 N - 1에서는 높이가 1이어야 계단 수가 가능
count[i][9] = count[i - 1][8]; // N에서 높이가 9이면 N - 1에서는 높이가 8이어야 계단 수가 가능
// 높이가 1 ~ 8이면서 N - 1에서 자신보다 한 단계 위 또는 한 단계 아래 높이에서 올 수 있음
for(int j = 1; j <= 8; j++)
{
count[i][j] = (count[i - 1][j - 1] + count[i - 1][j + 1]) % 1000000000; // 나온 결과를 1000000000 나머지 연산 수행하기
}
}
long result = 0;
for(int i = 0; i <= 9; i++)
{
result = (result + count[N][i]) % 1000000000; // 정답값을 더할 때도 % 연산 수행
}
cout << result; // result 출력하기
return 0;
}
728x90
'코딩테스트 > 백준' 카테고리의 다른 글
[백준][C++]1197번 최소 스패닝 트리 (0) | 2023.07.13 |
---|---|
[백준][C++]1707번 이분 그래프 (0) | 2023.07.12 |
[백준][C++]2751번 수 정렬하기 2 (0) | 2023.07.06 |
[백준][C++]1300번 K번째 수 (0) | 2023.07.06 |
[백준][C++]2750번 수 정렬하기 (0) | 2023.07.05 |