[백준] 15988_1, 2, 3 더하기 3 C++


기초적인 DP 문제

정답제출코드


#include <iostream>

#define MOD 1000000009

using namespace std;

typedef long long ll;

int N;
ll DP[1000001];

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> N;

    DP[1] = 1;
    DP[2] = 2;
    DP[3] = 4;
    
    for (int i = 4; i <= 1000000; ++i)
        DP[i] = (DP[i-1] + DP[i-2] + DP[i-3]) % MOD;

    for (int i = 0; i < N; ++i)
    {
        int _input;
        cin >> _input;

        cout << DP[_input] % MOD << '\n';
    }


    return 0;
}


우선 경우의 수를 일일이 세어보면

  • N = 1 : 1
  • N = 2 : 2
  • N = 3 : 4
  • N = 4 : 7
  • N = 5 : 13
  • N = 6 : 24 …

이렇게 된다.

여기서, N >= 4일때, 아래와 같은 점화식이 세워진다.

DP[i] = DP[i-1] + DP[i-2] + DP[i-3]

이렇게 해서 저장해주면 끝이다.

다만, 이문제는 1000000009로 나눈 나머지를 출력하라고 했으니 저장할 때 나머지 연산을 사용해주도록 하자.


© 2022.07. by Wookey_Kim

Powered by Hydejack v7.5.2