https://www.acmicpc.net/problem/15988
[필자 사고]
점화식을 세우기 쉬운 dp문제이다.
주목해야 될 숫자들은 1, 2,3, 이다.
계단식 문제와 같은 풀이를 진행해주면 쉽게 풀 수 있다.
상세한 내용은 아래에 적어 놓겠다.
dp[n] = dp[n-1] + dp[n-2] + dp[n-3]
[코드 해설]
1. 동적 계획법 (DP) 배열 초기화 (Make_DP 함수)
Make_DP 함수는 최대 1,000,000까지의 정수를 다룰 수 있도록 DP 배열을 초기화하는 역할을 한다.
- dp 벡터를 크기 1,000,001로 설정한다.
- 점화식 기반으로 DP 배열을 채운다.
- dp[1] = 1 → 1을 만드는 방법: {1}
- dp[2] = 2 → 2를 만드는 방법: {1+1, 2}
- dp[3] = 4 → 3을 만드는 방법: {1+1+1, 1+2, 2+1, 3}
- dp[n] = dp[n-1] + dp[n-2] + dp[n-3]을 사용하여 n까지 계산
- 매 연산마다 1000000009로 나머지를 구해 값이 너무 커지는 것을 방지한다.
2. 입력 처리 (Game_Start 함수)
Game_Start 함수는 입력값 N을 받아 해당하는 DP 결과값을 출력하는 역할을 한다.
- cin을 통해 N 값을 입력받는다.
- dp[N] 값을 출력한다.
3. 프로그램 실행 (main 함수)
- T(테스트 케이스 개수)를 입력받는다.
- Make_DP()를 호출하여 DP 테이블을 초기화한다.
- T번 반복하며 Game_Start() 함수를 실행한다.
[소스 코드]
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
vector<long> dp;
int N;
void Make_DP() {
dp.resize(1000001);
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i <= 1000000; i++) {
dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1];
dp[i] %= 1000000009;
}
}
void Game_Start() {
cin >> N;
cout << dp[N] << '\n';
}
int main(void) {
int T;
cin >> T;
Make_DP();
while (T--) {
Game_Start();
}
}
'백준 > 동적프로그래밍' 카테고리의 다른 글
백준 1309 c++ "동물원" -PlusUltraCode- (0) | 2025.02.17 |
---|---|
백준 1965 c++ "상자넣기" -PlusUltraCode- (0) | 2025.02.10 |
백준 1699 c++ "제곱수의 합" -PlusUltraCode- (0) | 2025.02.10 |
백준 11055 c++ "가장 큰 증가하는 부분 수열" -PlusUltraCode- (0) | 2025.02.10 |
백준 1003 c++ "피보나치 함수" -PlusUltraCode- (0) | 2025.02.09 |