728x90
728x90

https://www.acmicpc.net/problem/1309
1309번: 동물원
첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.
www.acmicpc.net


난이도: solved.ac 실버 1
알고리즘 분류
다이나믹 프로그래밍 (dp)
접근 방법
이 문제에서 중요한 부분은 가로 또는 세로로 붙여서 배치시킬 수 없다는 것이다
따라서, 사자를 배치하는 경우는 아래 세 가지로 나눌 수 있다
1) 이전 칸에서 왼쪽에 배치한 경우
2) 이전 칸에서 오른쪽에 배치한 경우
3) 이전 칸 둘 다 배치하지 않은 경우
1번의 경우에는 이전에 왼쪽에 배치되어 있으므로 왼쪽에 또 배치시킬 수 없다
따라서 오른쪽 칸에 배치시키거나 아예 둘 다 비워놓는 경우만 가능하다
2번의 경우에는 이전에 오른쪽에 배치되어 있으므로 오른쪽에 또 배치시킬 수 없다
따라서 왼쪽에 배치시키거나 아예 둘 다 비워놓는 경우만 가능하다
3번의 경우에는 이전의 두 칸 모두 비어있으므로 어느 쪽에나 배치시킬 수 있다
따라서 왼쪽에 배치시키는 경우, 오른쪽에 배치시키는 경우, 두 칸 모두 비워놓는 경우 세 가지가 가능하다
이를 그림으로 나타내면 아래와 같다


이를 점화식으로 나타내면 다음과 같다

코드
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int N; scanf("%d", &N); int pL, pR, pO, sum; int L = 1, R = 1, O = 1; while (--N) { pL = L; pR = R; pO = O; L = (pR + pO) % 9901; R = (pL + pO) % 9901; O = (pL + pR + pO) % 9901; } sum = (L + R + O) % 9901; printf("%d", sum); return 0; }
반응형