대놓고 점화식 세우라고 힌트 준 DP문제이다.
한 삼각형의 변이 어떤 규칙에 의해 정해지는지 확인해보자.
1, 1, 1, 2, 2, 3, 4, 5, 6, 7, 9
이 문제를 해결할 때, 난 6번째 삼각형부터 확실한 규칙이 보였다.
6번째부터 파란색 삼각형의 한 변의 길이는 두 개의 흰색 삼각형 변의 길이의 합이고, 흰색 삼각형의 한변의 길이는 두 개의 파란색 변의 길이의 합인 것을 봤다.
다시 눈을 크게 뜨고 보자.
삼각형의 변의 길이를 결정하는 두 개의 삼각형 중 하나는 무조건 바로 전에 만들어진 삼각형이고, 다른 하나는 5번째 전에 만들어진 삼각형이다.
결국 점화식은 \(a_n = a_{n-1} + a_{n-5}\) 이 된다.
코딩 하자 !
아 참.. 이 문제는 n이 100까지라 int형 범위를 초과할 수 있다.
사실 나도 배열을 int형으로 선언하고 틀렸습니다를 받은 다음에 범위를 초과할 수 있다는 것을 캐치했다.
그러니.. 배열을 long long 타입으로 선언하자.
#include <bits/stdc++.h>
using namespace std;
long long dp[101];
int main() {
ios::ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
dp[1] = 1;
dp[2] = 1;
dp[3] = 1;
dp[4] = 2;
dp[5] = 2;
for (int i = 6; i < 101; i++) dp[i] = (dp[i - 1] + dp[i - 5]);
int T, n;
cin >> T;
while (T--) {
cin >> n;
cout << dp[n] << '\n';
}
return 0;
}
'BOJ_단계별로 풀어보기(9단계~) > [14단계] 동적 계획법1' 카테고리의 다른 글
[백준 1932] 정수 삼각형 (0) | 2022.04.07 |
---|---|
[백준 1149] RGB거리 (0) | 2022.04.07 |
[백준 1904] 01타일 (0) | 2022.04.06 |
[백준 9184] 신나는 함수 실행 (0) | 2022.04.05 |
[백준 1003] 피보나치 함수 (0) | 2022.03.17 |