다이나믹 프로그래밍 문제입니다.
피보나치에서 조금 응용된 형태입니다.
0 = 1
1 = 1
2 = 2
3 = 4
위와 같은 기본 값을 미리 입력하고
DP[i] = DP[i - 1] + DP[i - 2] + DP[i - 3] + DP[i - 4];
다음과 같은 방식으로 문제를 해결하였습니다.
#include <iostream>
#include <cstring>
using namespace std;
long long int DP[10010];
int main(int argc, char *argv[]){
int ts;
int checkPoint = 3;
cin >> ts;
memset(DP, 0, sizeof(DP));
DP[0] = 1;
DP[1] = 1;
DP[2] = 2;
DP[3] = 4;
while (ts--) {
int n;
cin >> n;
if(DP[n]){
cout << DP[n] << endl;
continue;
}
for (int i = checkPoint + 1; i <= n; ++i) {
DP[i] = DP[i - 1] + DP[i - 2] + DP[i - 3] + DP[i - 4];
}
cout << DP[n] << endl;
checkPoint = n;
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 5557번 1학년 (0) | 2019.07.15 |
---|---|
[C++] 백준 10164번 격자상의 경로 (0) | 2019.07.13 |
[C++] 백준 10942번 팰린드롬? (0) | 2019.07.10 |
[C++] 백준 2011번 암호코드 (0) | 2019.07.10 |
[C++] 백준 1904번 01타일 (0) | 2019.07.10 |