※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 3948번 문제인 홍준이의 친위대이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/3948
3948번: 홍준이의 친위대
홍준 왕국의 국왕 홍준이는 자신을 호위하는 N명의 친위대 병사가 있다. 병사들의 키는 모두 다르다. 홍준이는 그들을 일렬로 세울 때, 키 순서대로 세우는 것보다 맨 끝 두 병사를 제외한 나머
www.acmicpc.net
1부터 20까지의 alternating permutation의 개수를 구하는 문제이다.
incr[i][j]를 숫자 j를 첫 숫자로, 증가하는 것으로 시작하는 순열의 개수라 하고, decr[i][j]를 숫자 j를 첫 숫자로, 감소하는 것으로 시작하는 순열의 개수라 하자.
이 때 incr[i][j]는 i보다 큰 수로 시작하면서 감소하는 이어질 수 있는 순열의 개수, decr[i][j]는 i보다 작은 수로 시작하면서 증가하는 이어질 수 있는 순열의 개수와 같다는 점을 이용하여 점화식을 세울 수 있다.
위 점화식을 이용하여 문제를 해결해보자.
아래는 제출한 소스코드이다.
#include<iostream>
using namespace std;
typedef long long ll;
ll incr[21][21], decr[21][21];
ll ans[21];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
incr[2][1] = decr[2][2] = 1;
for (int i = 3; i <= 20; i++) {
for (int j = 2; j <= i; j++) {
decr[i][j] = decr[i][j - 1] + incr[i - 1][j - 1];
}
for (int j = i - 1; j >= 1; j--) {
incr[i][j] = incr[i][j + 1] + decr[i - 1][j];
}
}
ans[1] = 1;
for (int i = 2; i <= 20; i++) {
for (int j = 1; j <= i; j++) ans[i] += incr[i][j];
for (int j = 1; j <= i; j++) ans[i] += decr[i][j];
}
int T; cin >> T;
while (T--) {
int x; cin >> x;
cout << ans[x] << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1450 // C++] 냅색문제 (0) | 2021.10.30 |
---|---|
[BOJ 1563 // C++] 개근상 (0) | 2021.10.29 |
[BOJ 8907 // C++] 네온 사인 (0) | 2021.10.27 |
[BOJ 15824 // C++] 너 봄에는 캡사이신이 맛있단다 (0) | 2021.10.26 |
[BOJ 15817 // C++] 배수 공사 (0) | 2021.10.25 |