https://www.acmicpc.net/problem/9095
이 문제는 규칙을 파악하는 문제다.
필자도 아무리 생각해도 갈피를 못 잡아 인터넷 참고를 조금 했다.
- 풀이 -
n = 1 일때, ( 1 )로, 경우의 수는 1개.
n = 2일때, (1 + 1), ( 2 )로, 경우의 수는 2개.
n = 3일때, (1 + 1 + 1), (1 + 2), (2 + 1), ( 3 )으로 경우의 수는 4개.
n = 4는 문제 예시에 나와있으므로 7개.
어라? n = 1~3 까지의 경우를 더한게 n = 4의 경우의 수랑 같네?
위의 사실로는 n[i] = n[i-3] + n[i-2] + n[i-1] 과 같다.
우연일지도 모른다. 그래서 일단 위의 가설을 전제로 n = 7까지 계산해보자.
n = 5, 13개
n = 6, 24개.
n = 7, 44개.
어? n = 7일 때의 경우의 수가 입력 예제의 n = 7과 같네?
그럼 확정 됬다.
이 문제의 점화식은, 각 n 값마다의 경우의 수를 dp[i]라고 할때,
dp[i] = dp[i-3] + dp[i-2] + dp[i-1]
가 되시겠다.
이번엔 실마리를 봐버렸지만, 다음번에는 꼭 규칙을 깨닫기를..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <iostream> int dp[12] = {0, 1, 2, 4, }; void DP() { for (int i = 4; i <= 12; i++) dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1]; return; } int main() { DP(); int T; std::cin >> T; int temp; for (int i = 1; i <= T; i++) { std::cin >> temp; std::cout << dp[temp] << std::endl; } return 0; } | cs |
'BOJ' 카테고리의 다른 글
[BOJ][DP] 2167. 2차원 배열의 합 (0) | 2018.01.12 |
---|---|
[BOJ][DP] 11052. 붕어빵 (0) | 2018.01.09 |
[BOJ][DP] 11048. 이동하기 (0) | 2018.01.09 |
[BOJ][DP] 2156 포도주 시식 (0) | 2017.12.25 |
[BOJ][DP] 1932. 숫자삼각형 (0) | 2017.11.25 |