점화식만 찾아낸다면 정말 간단한 문제입니다. N이 0일 경우 만들 수 있는 타일의 개수는 0개입니다. 1일 경우 1개, 2일 경우 2개라고 문제에 나와 있죠. 3은 011, 100, 111로 3개입니다. 4의 경우는 5개로 문제에 나와 있습니다. 해를 쭉 나열해보면 0, 1, 2, 3, 5인데, 피보나치 수열과 굉장히 유사합니다. 작은 문제를 쌓아 큰 문제를 푸는 상향식(Bottom-up) 동적 계획법을 이용하면 쉽게 해결할 수 있습니다.
#include<iostream>
using namespace std;
#define MAX 1000001
int DP[MAX];
int tile(int n)
{
for (int i = 0; i < 3; i++) DP[i] = i;
for (int i = 3; i <= n; i++) DP[i] = (DP[i - 1] + DP[i - 2]) % 15746;
return DP[n];
}
int main(void)
{
int n; cin >> n;
cout << tile(n) << endl;
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준/C,C++] 1149번: RGB거리 (0) | 2021.03.07 |
---|---|
[백준/C,C++] 9461번: 파도반 수열 (0) | 2021.03.07 |
[백준/C,C++] 9184번: 신나는 함수 실행 (0) | 2021.03.07 |
[백준/C,C++] 1003번: 피보나치 함수 (0) | 2021.03.07 |
[백준/C,C++] 14889번: 스타트와 링크 (0) | 2021.03.06 |
댓글