본문 바로가기

BOJ/C++

[BOJ] 동물원

 

문제

어떤 동물원에 가로로 두칸 세로로 N칸인 아래와 같은 우리가 있다.

이 동물원에는 사자들이 살고 있는데 사자들을 우리에 가둘 때, 가로로도 세로로도 붙어 있게 배치할 수는 없다. 이 동물원 조련사는 사자들의 배치 문제 때문에 골머리를 앓고 있다.

동물원 조련사의 머리가 아프지 않도록 우리가 2*N 배열에 사자를 배치하는 경우의 수가 몇 가지인지를 알아내는 프로그램을 작성해 주도록 하자. 사자를 한 마리도 배치하지 않는 경우도 하나의 경우의 수로 친다고 가정한다.

입력

첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.

출력

첫째 줄에 사자를 배치하는 경우의 수를 9901로 나눈 나머지를 출력하여라.

 

1309 맞았습니다!! 3156 0 C++14 / 수정 750
 

1. DP[n][0] = 이 행에 사자가 없는 경우 

DP[n][1] = 이 행의 1열에 사자가 있는 경우 

DP[n][2] = 이 행에 2열에 사자가 있는 경우 

 

2. 사자가 없는 경우도 하나의 경우로 간주하기 때문에 

가장 윗 칸에 세 가지 경우에 따라 아래에 사자 배치도가 달라진다. 

 

i) 사자가 없는 경우 dp[0][0]

ii) 사자가 1열에 있는 경우 dp[0][1]

iii) 사자가 2열에 있는 경우 dp[0][2]

모두 하나의 경우로 초기화 해준다. 

 

3. 2행부터는 앞의 상황에 따라 경우의 수를 더해준다. 

만약, 앞 행에 사자가 한 마리도 없는 경우 -> 지금 행에는 사자가 없을 수도, 1열이나 2열에 사자가 있을 수도 있다. 

앞 행의 1열에 사자가 있는 경우 -> 지금 행에는 사자가 없거나, 2열에 있어야 한다. 

앞에의 2열에 사자가 있는 경우 -> 지금 행에는 사자가 없거나, 1열에 있어야 한다. 

 

이 경우들을 모두 더해준다. 


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
#include <iostream>
#include <vector>
 
#define MAXN 100001
 
using namespace std;
 
int dp[MAXN][3];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    int n;
    cin >> n;
 
    dp[0][0= dp[0][1= dp[0][2= 1;
    // fill(&dp[0][0], &dp[MAXN][3], 1); //ㅅㅏ자가 없는 경우에도 경우의 수로 치기 때문에 1로 초기화 
    for (int i = 1; i < n; i++)
    {
        dp[i][0+= (dp[i-1][0+ dp[i-1][1+ dp[i-1][2]) % 9901;
        //현재 칸에 사자가 없는 경우에는 이전 칸에 뭐가 있어도 된다. 
        dp[i][1+= (dp[i-1][0+ dp[i-1][2])%9901;
        dp[i][2+= (dp[i-1][0+ dp[i-1][1])%9901;
    }
 
    cout << (dp[n-1][0+ dp[n-1][1+ dp[n-1][2])%9901 << '\n';
    return 0;
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

'BOJ > C++' 카테고리의 다른 글

게임  (0) 2020.02.04
[BOJ] 단어 수학  (0) 2020.02.03
[BOJ] 궁금한 민호  (0) 2020.01.27
[BOJ] 회의실 배정  (0) 2020.01.27
[BOJ] 피아의 아틀리에 ~신비한 대회의 연금술사~  (0) 2019.10.29