728x90
반응형
https://www.acmicpc.net/problem/1309
1309번: 동물원
첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.
www.acmicpc.net
문제
어떤 동물원에 가로로 두칸 세로로 N칸인 아래와 같은 우리가 있다.이 동물원에는 사자들이 살고 있는데 사자들을 우리에 가둘 때, 가로로도 세로로도 붙어 있게 배치할 수는 없다. 이 동물원 조련사는 사자들의 배치 문제 때문에 골머리를 앓고 있다.
동물원 조련사의 머리가 아프지 않도록 우리가 2*N 배열에 사자를 배치하는 경우의 수가 몇 가지인지를 알아내는 프로그램을 작성해 주도록 하자. 사자를 한 마리도 배치하지 않는 경우도 하나의 경우의 수로 친다고 가정한다.
입력
첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.
출력
첫째 줄에 사자를 배치하는 경우의 수를 9901로 나눈 나머지를 출력하여라.
풀이
📌 다이나믹 프로그래밍 (DP)
각각의 행마다 동물을 왼쪽 또는 오른쪽에 배치할 경우, 배치하지 않을 경우를 생각해야 한다.
dp[i][j]
배치하지 않을 경우, 전의 행에서 동물을 어디에 배치하든지 상관이 없다.
dp[i][0] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2];
왼쪽에 배치할 경우, 전의 행에서 동물을 배치하지 않거나 오른쪽에 배치해야 한다.
dp[i][1] = dp[i-1][0] + dp[i-1][2];
오른쪽에 배치할 경우, 전의 행에서 동물을 배치하지 않거나 왼쪽에 배치해야 한다.
dp[i][2] = dp[i-1][0] + dp[i-1][1];
코드
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
//dp[i][j]에서 j가 1일 때 동물을 왼쪽에 배치, 2일 때 오른쪽에 배치
//0일때 아무데도 배치 안함
long long dp[100001][3];
dp[0][0] = 1;
dp[0][1] = 1;
dp[0][2] = 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;
}
int ans = (dp[n-1][0]+dp[n-1][1]+dp[n-1][2]) % 9901;
cout << ans;
}
결과

728x90
반응형
'BOJ 백준 > 다이나믹 프로그래밍' 카테고리의 다른 글
[BOJ] 2156번: 포도주 시식 (0) | 2022.08.17 |
---|---|
[BOJ] 11057번: 오르막 수 (0) | 2022.08.16 |
[BOJ] 13398번: 연속합 2 (2) | 2022.08.15 |
[BOJ] 2407번: 조합 (1) | 2022.05.02 |
[BOJ] 1149번: RGB거리 (0) | 2022.04.21 |