코드

풀이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로 나머지를 구하라 하였는데 귀찮아서 안했다가 두번이나 틀렸다...

'알고리즘 > 다이나믹프로그래밍' 카테고리의 다른 글

백준11052 카드 구매하기  (0) 2019.01.25
백준10844 쉬운 계단 수  (0) 2019.01.25
백준 11727 2Xn 타일링 2  (2) 2018.11.07
백준 9095번 1,2,3더하기  (0) 2018.11.07
Dynamic알고리즘[1463번]  (0) 2018.11.02

+ Recent posts