반응형

문제 링크

 

2193번: 이친수

0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않는다. 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다. 예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되

www.acmicpc.net

 

풀이 ) DP

  문제에서 주어진 이친수는 01로 끝나거나 0으로 끝날 수 있다.

  01로 끝나는 경우는 n-2자리 이친수의 뒤에 01을 붙인 경우로 볼 수 있고

  0으로 끝나는 경우는 n-1자리 이친수의 뒤에 0을 붙인 경우로 볼 수 있다.

  따라서 이 때의 점화식은 memo[n] = memo[n-1] + memo[n-2]의 꼴이 됨을 알 수 있다.

#include <cstdio>
#include <algorithm>
using namespace std;

long long memo[92] = {0, 1, 1, };

int main(void)
{
    int n;
    scanf("%d", &n);

    for(int i = 3; i <= n; ++i)
        memo[i] = memo[i-1] + memo[i-2];

    printf("%lld\n", memo[n]);
}

 

착오 )

  처음에는 끝이 아닌 앞을 보고 시작했었다.

  그런데 이럴 경우 2자리 이상일 때 10으로 시작하기는 하지만

  이후 3번째 자리부터는 0으로 시작할 수 있기 때문에 이전에 구한 값을 이용할 수 없어서 불가능했다.

반응형

+ Recent posts