문제 링크 : https://www.acmicpc.net/problem/1309
풀이
다이내믹 프로그래밍 문제입니다!
2X1 칸에 사자를 배치하는 경우는
- 왼쪽 사자
- 오른쪽 사자
- 사자 없음
세 가지이며, 사자들은 가로,세로에 붙어있을 수 없다.
각각의 경우를 0,1,2로 표현했을 경우
d[i][j] = i칸에 j상태의 사자가 있을 경우 사자 배치의 경우의 수
라고 표현 가능하며 각각
- d[i][0] = d[i-1][1] + d[i-1][2]
- d[i][1] = d[i-1][0] + d[i-1][2]
- d[i][2] = d[i-1][0] + d[i-1][1] + d[i-1][2]
이다. 따라서 정답은 d[i]에 해당하는 원소들을 모두 더해준 값을 9901로 나누면 된다.
참고로 n의 최댓값이 100,000 이므로 경우의 수를 구할 때 마다 9901로 나누어 주어야 long long 범위 내에 출력이 가능합니다!
소스 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#define mod 9901
#include <iostream>
using namespace std;
long long d[100001][3];
int main()
{
int n; scanf("%d", &n);
d[1][0] = 1; d[1][1] = 1; d[1][2] = 1;
for (int i = 2; i <= n; i++) {
d[i][0] = (d[i - 1][0] + d[i - 1][1] + d[i - 1][2]) % mod;
d[i][1] = (d[i - 1][0] + d[i - 1][2]) % mod;
d[i][2] = (d[i - 1][0] + d[i - 1][1]) % mod;
}
long long ans = 0;
for (int i = 0; i < 3; i++) {
ans = (ans + d[n][i]) % mod;
}
printf("%lld", ans);
return 0;
}
|
cs |
개발환경 : Visual Studio 2019
지적, 조언 언제든지 환영입니다~~
'백준 문제풀이' 카테고리의 다른 글
백준 1697번 숨바꼭질 (0) | 2020.01.16 |
---|---|
백준 17404 RGB 거리 2 (0) | 2020.01.16 |
백준 17087 숨바꼭질 6 (0) | 2020.01.16 |
백준 17299번 오등큰수 (0) | 2020.01.16 |
백준 17298번 오큰수 (0) | 2020.01.16 |