문제
어떤 동물원에 가로로 두칸 세로로 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 |