https://www.acmicpc.net/problem/1309
1309번: 동물원
첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.
www.acmicpc.net
Nx2 우리가 있고 가로/세로 붙여서 사자를 배치하면 안 된다. 이 우리에 사자를 배치하는 경우의 수를 구하라.
N 줄의 우리가 있으니까 i(1~N) 개일 때 경우의 수를 모두 차례대로 구해보면 된다.
1x2 우리에서 사자를 배치하는 경우는 (1,0), (0,1), (0,0) 세 가지 경우가 있다.
이를 토대로, 마지막 줄에 위 세가지 경우를 포함한 경우의 수를 세보면 규칙이 나타난다.
i=2일 때는 (1,0)와 (0,1)의 경우는 2가지 (0,0)의 경우는 3가지
i=3일 때는 (1,0)와 (0,1)의 경우는 5가지 (0,0)의 경우는 7가지
이렇게만 봐도 규칙이 어느정도 보인다.
dp [3][0] = dp [2][1] + dp [2][2]
dp [3][1] = dp [2][1] + dp [2][2]
dp [3][2] = dp [2][0] + dp [2][1] + dp [2][2]
1. 초기값 정하기
dp [1][0] = dp [1][1] = dp [1][2] = 1을 초기값으로 정해준다
2. 점화식 구하기
위에서 규칙을 찾은 것을 바탕으로 점화식을 구한다.
dp [i][0] = dp [i-1][1] + dp [i-1][2]
dp [i][1] = dp [i-1][1] + dp [i-1][2]
dp [i][2] = dp [i-1][0] + dp [i-1][1] + dp [i-1][2]
#include <iostream>
#define num 100002
using namespace std;
int n;
long long dp[num][3];
void input(){
cin >> n;
}
void solution(){
//2*1 우리라면, (0, 1) 혹은 (1, 0), (0, 0)
dp[1][0] = 1; dp[1][1] = 1; dp[1][2] = 1; //초기화
for(int i=2; i<=n; i++){
dp[i][0] = (dp[i-1][1] + dp[i-1][2])%9901;
dp[i][1] = (dp[i-1][1] + dp[i-1][2])%9901;
dp[i][2] = (dp[i-1][0] + dp[i-1][1] + dp[i-1][2])%9901;
}
cout << (dp[n][0] + dp[n][1] + dp[n][2])%9901 << '\n';
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
input();
solution();
return 0;
}
💡공부 및 기록용 블로그이므로 오류가 있을 수 있습니다.💡
만약 문제에 오류나 오타가 있다면 댓글로 알려주세요➿
언제나 환영합니다. 감사합니다. 화이팅!
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 1592번: 영식이와 친구들 (0) | 2022.04.22 |
---|---|
[백준/c++] 9465번: 스티커 (0) | 2022.03.10 |
[백준/c++] 2156번: 포도주 시식 (0) | 2022.03.07 |
[백준/c++] 1149번: RGB 거리 (0) | 2022.03.07 |
[백준/c++] 11052번: 카드 구매하기 (0) | 2022.02.28 |