알고리즘/다이나믹프로그래밍

[백준11726번 - 2xn 타일링]

leo_____lee 2018. 11. 3. 10:24

코드

풀이1

#include <iostream>
using namespace std;

class bj11726{
private:
    int m_nVal;
    int* m_pArr;

public:
    bj11726() {

    }
    bj11726(int& val) {
        while (val > 1 || val > 1000) {
            cin >> val;
        }
        m_nVal = val;
        m_pArr = new int[m_nVal];
    }
    ~bj11726() {
        delete[] m_pArr;
    }
    void SetVal() {
        cin >> m_nVal;
        while (m_nVal < 1 || m_nVal > 1000) {
            cin >> m_nVal;
        }
        m_pArr = new int[m_nVal];
    }
    void SetArr() {
        int i = 0;
        if (m_nVal == 1) m_pArr[0] = 1;
        else if (m_nVal == 2) {
            m_pArr[0] = 1;
            m_pArr[1] = 2;
        }
        else {
            m_pArr[0] = 1;
            m_pArr[1] = 2;
            m_pArr[2] = 3;

            i = 3;
            while (i < m_nVal) {
                m_pArr[i] = (m_pArr[i - 1]+m_pArr[i-2])%10007 ;
                i++;
            }
        }
    }
    void printResult() {
        cout << m_pArr[m_nVal-1];
    }
};

int main()
{
    bj11726 ex;
    ex.SetVal();
    ex.SetArr();
    ex.printResult();
    return 0;
}

그냥 넘어가기 아쉬워서...T[N]=T[N-1]+T[N-2]=T[N-2]+T[N-3]+T[N-2]=2T[N-2]+T[N-3]을 증명

// bj11726.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
//
#include "stdafx.h"
#include <iostream>
using namespace std;

class bj11726{
private:
    int m_nVal;
    int* m_pArr;

public:
    bj11726() {

    }
    bj11726(int& val) {
        while (val > 1 || val > 1000) {
            cin >> val;
        }
        m_nVal = val;
        m_pArr = new int[m_nVal];
    }
    ~bj11726() {
        delete[] m_pArr;
    }
    void SetVal() {
        cin >> m_nVal;
        while (m_nVal < 1 || m_nVal > 1000) {
            cin >> m_nVal;
        }
        m_pArr = new int[m_nVal];
    }
    void SetArr() {
        int i = 0;
        if (m_nVal == 1) m_pArr[0] = 1;
        else if (m_nVal == 2) {
            m_pArr[0] = 1;
            m_pArr[1] = 2;
        }
        else {
            m_pArr[0] = 1;
            m_pArr[1] = 2;
            m_pArr[2] = 3;

            i = 3;
            while (i < m_nVal) {
                m_pArr[i] = (m_pArr[i - 3]+2*m_pArr[i-2])%10007 ;
                i++;
            }
        }
    }
    void printResult() {
        cout << m_pArr[m_nVal-1];
    }
};

int main()
{
    bj11726 ex;
    ex.SetVal();
    ex.SetArr();
    ex.printResult();
    return 0;
}

결과

실수한점

뒤에 런타임 에러로 인해 백준 사이트에서 100007로 나머지를 구하라 하였는데 귀찮아서 안했다가 두번이나 틀렸다...