문제


문제의 종류는 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

+ Recent posts