less than 1 minute read

  • 분류: 다이나믹 프로그래밍

코드

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    int i=0, j=1;
    int idx = n;
    while(idx > 0) {
        int temp = j;
        j = (i+j)%15746;
        i = temp;
        idx--;
    }
    cout << j;
    cout << '\n';
}
  • 코멘트

    이런 것도 다이나믹 프로그래밍이라고 할 수 있나?
    처음 문제를 보면 막막하다. 이게 뭐지?
    하지만 알고 나면 너무 쉽다. 그냥 피보나치 수열이다. 길이 n개짜리 이진 수열은 길이 (n-1)짜리의 왼쪽에 1을 붙이거나, 길이 (n-2)짜리의 왼쪽에 00을 붙여서 만들거나 둘 중 하나다.
    따라서 f(n)=f(n-1)+f(n-2)이고, f(1)=1, f(2)=2가 된다.
    다만 n이 최대 100만이기 때문에 재귀로 하면 안되고, 더 간단한 방법으로 해야 된다. O(n)짜리 훌륭한 방법이다.

Tags: ,

Categories:

Updated: