문제

풀이
#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] = 3;
}
else {
m_pArr[0] = 1;
m_pArr[1] = 3;
m_pArr[2] = 5;
i = 3;
while (i < m_nVal) {
m_pArr[i] = (m_pArr[i - 1] + 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;
}
풀이방법
끝에 부분이 다른 경우는 이전칸에서 2*1이 들어가는 경우. 전전칸에서 2*2나 1*2로 이루진 것이 들어가는 경우이다.m_pArr[i] = m_pArr[i - 1] + 2 * m_pArr[i - 2]
결과
