놓을 수 있는 건 1번 경우와 같이 X, 왼, 오

이렇게 3개 다 놓으려면 가장 아랫줄이 빈칸이어야 한다.
 그 외의 경우에는 2개를 놓을 수 있다.
빈칸인 경우는 n-2와 같다. 왜냐하면 빈칸은 모든 경우에 한번씩 들어가므로 n-1을 만들기위해 사용한 n-2에서 하나씩 만들어 졌기 때문
그외의 경우의 개수는 n-1에서 n-2의 경우를 빼준 것과 같다. 그 경우는 *2씩 해주면 되므로 

마이너스의 모듈러 연산에서는 연산결과가 -가 될 수 있기 때문에 그 경우 mod를 더해줘야 한다. 

#include <iostream>
#include <algorithm>
#include <cstring>
#include <limits.h>
#include <stack>
using namespace std;
typedef long long ll;
ll stb[10001]; // single table
ll sche[100001]; // single cache
int tb[1001][1001];
int cache[1001][1001];
int n,m;
const int mod = 9901;
int main(void) {
       
       cin >> n;
       sche[0] = 1;
       sche[1] = 3;
       for (int i = 2; i <= n; ++i) {
              
              int wow = sche[i - 1] - sche[i - 2];
              if (wow < 0) {
                     wow += mod;
              }
              
              sche[i] = (sche[i-2]*3)%mod  + (2*(wow))%mod;
       }
       cout << sche[n]%mod;
       
       
       return 0;
}


'알고리즘' 카테고리의 다른 글

[DP] 백준 2096 내려가기  (0) 2018.04.29
[DP] 백준 9507 Generations of Tribbles  (0) 2018.04.29
[DP] 백준 2225 합분해 (개수가 주어진 문제)  (0) 2018.04.29
[DP] 백준 1965 상자넣기  (0) 2018.04.29
[DP] 백준 9084 동전  (0) 2018.04.29

+ Recent posts