※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2392번 문제인 다각형의 분할이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2392
2392번: 다각형의 분할
첫째 줄에 N(1≤N≤1,000)이 주어진다. 답이 커질 수 있으므로 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
고정된 볼록다각형을 삼각형으로 분할하는 방법의 경우의 수는 카탈란 수와 같다는 것은 잘 알려져있다.
볼록다각형을 사각형으로 분할한다면 어떨까?
글쓴이는 다음과 같은 관찰을 통해 점화식을 세웠다.
1. 먼저 다각형의 한 변을 골라 고정한다.
2. 이 한 변을 포함하는 사각형의 대변(마주보는 변)을 결정한다면, 처음 고정한 변을 제외한 나머지 세 변들에 대하여 그 변 방향쪽에 남아있는 꼭짓점의 개수를 세는 것으로 꼭짓점의 개수가 적어진 부분 문제를 찾을 수 있게 된다.
위 점화식을 정리하고 초기값을 적절히 정해 잘 구현해주자.
아래는 제출한 소스코드이다.
#define MOD 1000000000
#include <iostream>
using namespace std;
typedef long long ll;
ll T[1001];
ll Q[1001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
ll N; cin >> N;
//삼각분할
T[2] = T[3] = 1;
for (int k = 4; k <= 1000; k++) {
for (int i = 2; i < k; i++) {
T[k] = (T[k] + T[i] * T[k + 1 - i]) % MOD;
}
}
T[2] = 0;
//사각분할
Q[0] = Q[2] = Q[4] = 1;
for (int k = 6; k <= 1000; k += 2) {
for (int L = 2; L < k; L += 2) {
for (int R = L; R < k; R += 2) {
Q[k] = (Q[k] + ((Q[L] * Q[R - L + 2]) % MOD) * Q[k - R]) % MOD;
}
}
}
Q[0] = Q[2] = 0;
cout << T[N] << '\n' << Q[N];
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 15824 // C++] 너 봄에는 캡사이신이 맛있단다 (0) | 2021.10.26 |
---|---|
[BOJ 15817 // C++] 배수 공사 (0) | 2021.10.25 |
[BOJ 1215 // C++] 잘못 작성한 요세푸스 코드 (0) | 2021.10.23 |
[BOJ 6523 // C++] 요세푸스 한 번 더! (0) | 2021.10.22 |
[BOJ 1179 // C++] 마지막 요세푸스 문제 (0) | 2021.10.21 |