본문 바로가기
Algorithm/BOJ

동물원 - 1309번

by y.j 2019. 4. 29.
728x90

해결방법

O을 배치한 경우, X를 배치 하지 않은 경우라고 할 때 O X | X O | X X 3가지 경우의 수로 둘 수 있다. 그래서 dp를 N * 3개의 배열을 두고 시작하였다.

 int dp[100001][3]

점화식은 어떻게 될까? 점화식도 3가지로 나눌 수 있다. 만약 O X경우라면 이전의 경우의 수는 X O | X X가 되어야만 하기 때문에 아래와 같아진다. 나머지도 똑같은 방식으로 구해본다면 점화식을 구할 수 있다.
$$ dp[i][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] + dp[i-1][2] $$

전체코드

#include<iostream>
using namespace std;
int dp[100001][3], N;
const int INF = 9901;
int main() {
    cin >> N;
    dp[0][0] = dp[0][1] = dp[0][2] = 1;
    for (int i = 1; i < N; ++i) {
        dp[i][0] = (dp[i - 1][1] + dp[i - 1][2]) %INF;
        dp[i][1] = (dp[i - 1][0] + dp[i - 1][2]) % INF;
        dp[i][2] = (dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][2]) % INF;
    }
    cout << (dp[N-1][0] + dp[N-1][1] + dp[N-1][2]) %INF << '\n';
    return 0;
}
728x90

'Algorithm > BOJ' 카테고리의 다른 글

1931번 - 회의실 배정  (0) 2019.05.05
6549번 - 히스토그램에서 가장 큰 직사각형  (0) 2019.05.02
동전0 - 11047번  (0) 2019.04.29
3980번 - 선발명단  (0) 2019.04.20
1102번 - 발전소  (0) 2019.04.19

댓글