티스토리 뷰

백준 온라인 저지

190704 BOJ 1309 동물원

Stolen Moments 2019. 7. 4. 19:54

다이나믹 프로그래밍


1. 사자를 배치하는 경우의 수는 왼쪽, 오른쪽, 배치 안하기 3가지 경우의 수

2. 바로 윗칸에 배치된 경우는 배치할 수 없다.


3.

왼쪽에 배치하는 경우의 수 = 직전 윗 칸의 오른쪽에 배치하는 경우의 수 + 직전에 배치 안하는 경우의 수

오른쪽에 배치하는 경우의 수 = 직전 윗 칸의 왼쪽에 배치하는 경우의 수 + 직전에 배치 안하는 경우의 수


배치 안하는 경우의 수는 제약이 없으므로 직전 윗 칸의 왼쪽, 오른쪽, 배치 안하는 경우의 수를 합하면 된다.


식을 세워보면


D[100001][3] : D[행번호][왼쪽, 오른쪽, 배치x]



D[i][0] = D[i - 1][1] + D[i - 1][2] : i행의 왼쪽에 배치하는 경우의 수 = i - 1행의 오른쪽 배치 + i - 1행의 배치x

D[i][1] = D[i - 1][0] + D[i - 1][2] : i행의 오른쪽에 배치하는 경우의 수 = i - 1행의 왼쪽 배치 + i - 1행의 배치x

D[i][2] = D[i - 1][0] + D[i - 1][1] + D[i - 1][2] : i행의 배치x = i - 1 행의 (왼쪽 + 오른쪽 + 배치x)




소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#define ll long long
#define un unsigned
#define FOR(i,a,b) for(int i = a; i < b; i++)
using namespace std;
int N;
un ll D[100001][3];
int main() {
    cin >> N;
    FOR(i, 03) D[0][i] = 1;
    FOR(i, 1, N) {
        D[i][0= (D[i - 1][1+ D[i - 1][2]) % 9901;
        D[i][1= (D[i - 1][0+ D[i - 1][2]) % 9901;
        D[i][2= (D[i - 1][0+ D[i - 1][1+ D[i - 1][2]) % 9901;
    }
    cout << (D[N - 1][0+ D[N - 1][1+ D[N - 1][2]) % 9901;
}
cs



반응형

'백준 온라인 저지' 카테고리의 다른 글

210114 BOJ 2957 이진 탐색 트리  (0) 2021.01.14
200122 BOJ 2819 상근이의 로봇  (0) 2020.01.23
190411 BOJ 15683번 감시  (0) 2019.04.11
190408 BOJ 14891번 톱니바퀴  (0) 2019.04.08
190407 BOJ 12100번 2048 (Easy)  (0) 2019.04.07
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함