문제
문제의 종류는 DP
이다. 문제를 풀기위해서 타일의 개수를 세어보았다.
N = 1 일때는 1 이므로 1개이다.
N = 2 일때는 00, 11 이므로 2개이다.
N = 3 일떄는 111, 100, 001 이므로 3개이다.
N = 4 일때는 1111, 1100 , 1001, 0011 , 0000 이므로 총 5개이다.
N = 5 일때는 11111, 11100, 11001, 10011, 00111, 10000, 00100, 00001 이므로 총 8개이다.
N = 6 일때는 111111, 111100, 111001, 110011, 100111, 001111, 110000, 100100, 100001, 001100, 001001, 000011, 000000 총 13개이다.
N = 7 일때는 1111111, 0011111, 1001111, 1100111, 1110011, 1111001, 1111100, 1110000, 1100100, 1001100, 0011100, 1100001, 1000011, 0000111, 1000000, 0010000, 0000100, 0000001, 1001001, 0011001, 0011001 으로 총 13개이다.
이러한 반복을 통해 특정한 점화식을 이 식을 가진다는 것을 알 수 있다.
Dp[i] = Dp[i-1] + Dp[i-2]
이를 통해 구현 한 코드는 다음과 같다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <utility>
using namespace std;
int dp[1000001] = { 0,1,2,3 };
int main() {
cin.tie(NULL);
cout.tie(NULL);
ios::sync_with_stdio(false);
int num;
for (int i = 4; i <= 1000000; i++) {
dp[i] += (dp[i - 1] + dp[i - 2]) % 15746;
}
cin >> num;
cout << dp[num];
}
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ] 11053번 가장 긴 증가하는 부분 수열(LIS) (0) | 2021.07.02 |
---|