PS
BOJ 1309 : 동물원
lickelon
2025. 2. 2. 00:09
- 문제 링크 : boj.kr/1309
- 난이도 : S1
- 태그 : DP
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
#define MOD 9901
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n;
cin >> n;
vector<array<int, 3>> arr(n); //None, Left, Right
arr[0] = {1,1,1};
for(int i = 1; i < n; i++) {
arr[i][0] = (arr[i-1][0]+arr[i-1][1]+arr[i-1][2]) % MOD;
arr[i][1] = (arr[i-1][0]+arr[i-1][2]) % MOD;
arr[i][2] = (arr[i-1][0]+arr[i-1][1]) % MOD;
}
cout << (arr[n-1][0]+arr[n-1][1]+arr[n-1][2]) % MOD;
return 0;
}
풀이
한 행에 가능한 상태는 1. 사자가 없는 경우, 2. 사자가 왼쪽에 있는 경우, 3. 사자가 오른쪽에 있는 경우 총 세 가지이다.
각각의 상태에 대해서 가능한 경우의 수를 순차적으로 구해주면 답을 쉽게 구할 수 있다.
728x90