https://www.acmicpc.net/problem/15988
dp 문제이다. 1,000,000 보다 작거나 같은 양수 n은 1, 2, 3의 합으로 표현할 수 있다.
단, 합을 나타낼 때는 수를 1개 이상 사용해야 하며 n이 만일 4일 경우 dp[4]는
1 + 1 + 1 + 1
2 + 1 + 1
1 + 2 + 1
1 + 1 + 2
2 + 2
3 + 1
1 + 3 로 총 7가지 이다.
dp[3]의 경우
1 + 1 + 1
2 + 1
1 + 2
3 총 4가지 이며
dp[2]는
1 + 1
2 총 2가지 이다.
dp[5]까지만 살펴보자면
1 + 1 + 1 + 1 + 1
2 + 1 + 1 + 1
1 + 2 + 1 + 1
1 + 1 + 2 + 1
1 + 1 + 1 + 2
3 + 1 + 1
1 + 3 + 1
1 + 1 + 3
2 + 2 + 1
2 + 1 + 2
1 + 2 + 2
3 + 2
2 + 3
총 13가지이다.
규칙을 살펴 보자면 dp[5]는 전에 있었던 dp[4]에 맨 오른쪽에 1을 더한것 7 + dp [3]에 맨 오른쪽에 2를 더한것 4 + dp[2]에 맨 오른쪽에 3을 더한것 2 해서 7 + 4 + 2 = 총 13가지 인것을 알 수 있다. 따라서 식으로 정리해보면
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
초기값 세개를 넣어주고 4부터 max까지 for문을 돌려서 dp배열을 완성해 준 뒤 출력해주는 형식으로 코드를 짜보았다.
#include <iostream>
#include <algorithm>
#define MAX 1000001
#define MODULER 1000000009
using namespace std;
long long dp[MAX] = { 0, };
int main(int argc, char* argv[])
{
int test_case;
cin >> test_case;
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
dp[4] = 7;
for (int i = 5;i < MAX;i++) {
dp[i] = (dp[i - 1] + dp[i - 2] + dp[i - 3]) % MODULER;
}
for (int T = 1;T <= test_case;T++) {
int n;
cin >> n;
cout << dp[n] << '\n';
}
return 0;
}
1차 실패 dp값을 만들때 수의 제한 때문에 1000000009로 나누어 주어야 하는데 빼먹었다.
2차 실패 dp 전체 값을 나누어 주어야 하는데 실수로 괄호를 쓰지 않았다.
3차 성공!
다 풀어놓고 쓸데없는데에 힘빼는건 여전하다..
'코딩테스트 > C++' 카테고리의 다른 글
[백준 C++] 1309번: 동물원 (0) | 2024.05.12 |
---|---|
[백준 C++] 1149번: RGB거리 (0) | 2024.05.12 |
[백준 C++] 2225번: 합분해 (0) | 2024.04.27 |
[백준 C++] 1699번: 제곱수의 합 (0) | 2024.04.25 |
[백준 C++] 1912번: 연속합 (0) | 2024.04.24 |