https://www.acmicpc.net/problem/2302
2302번: 극장 좌석
주어진 조건을 만족하면서 사람들이 좌석에 앉을 수 있는 방법의 가짓수를 출력한다. 방법의 가짓수는 2,000,000,000을 넘지 않는다. (2,000,000,000 < 231-1)
www.acmicpc.net
DP를 활용하여 푸는 문제다. 일반항은 a(n) = a(n - 1) + a(n - 2) (a[0] = 1, a[1] = 1, a[2] = 2)이다. 서로 2개씩 인접한 자리만 교환이 가능하다. 3개 이상 섞으면 두 칸 떨어진 곳으로 이동할 가능성이 있다.
ex.)
1칸(a) : a -> 1
2칸(a b) : a b, b a -> 2
3칸(a b c) : a b c, b a c, a c b -> 3
4칸(a b c d) : a b c d, b a c d, a c b d, a b d c, b a d c -> 5
5칸(a b c d e) : a b c d e, b a c d e, a c b d e, a b d c e, a b c e d, b a d c e, b a c e d, a c b e d -> 8
6칸(a b c d e f) : a b c d e f, b a c d e f, a c b d e f, a b d c e f, a b c e d f, a b c d f e, b a d c e f, b a c d f e,
a b d c f e, a c b d f e, a c b e d f, b a c e d f, b a d c f e -> 13
.
.
.
일반항 : a(n) = a(n - 1) + a(n - 2) (a[0] = 1, a[1] = 1, a[2] = 2)
#include <iostream>
#include <vector>
using namespace std;
vector<int> d;
vector<int> v;
int mat[41];
long long int ans = 1;
//교환 가능한 자리의 모든 경우의 수, 일반항 : a[n] = a[n - 2] + a[n - 1], a[0] = 0, a[1] = 1, a[2] = 2
void findDP() {
for (int i = 0; i <= 40; i++) {
if (i == 0) {
d.push_back(0);
}
else if (i == 1) {
d.push_back(1);
}
else if (i == 2) {
d.push_back(2);
}
else {
d.push_back(d[i - 1] + d[i - 2]);
}
}
}
int main() {
int m, n;
int cnt = 0;
cin >> m;
cin >> n;
//고정석 표시
for (int i = 0; i < n; i++) {
int x;
cin >> x;
mat[x] = 1; //
}
//고정석을 기준으로 나눈 자리 교환한 자리
for (int i = 1; i <= m; i++) {
if (mat[i] == 1) { //고정석이면
if (cnt == 0) { //고정석이 연속으로 붙어 있어서 교환 가능한 자리가 없으면
continue; //무시
}
v.push_back(cnt); //고정석을 만나면 교환 가능한 자리를 벡터에 넣는다.
cnt = 0; //교환 가능한 자리를 0으로 초기화
}
else { //교환 가능한 자리면
cnt++; //교환 가능한 자리의 수를 증가
if (i == m) { //마지막 자리가 교환 가능한 자리면
v.push_back(cnt); //교환 가능한 자리의 갯수를 벡터에 넣는다.
}
}
}
findDP(); //DP실행
//교환 가능한 자리의 수의 맞게 DP로 환산한 값을 모두 곱한다.
for (int i = 0; i < v.size(); i++) {
ans = ans * d[v[i]];
}
cout << ans;
}
'백준' 카테고리의 다른 글
백준1059 - 수2 (0) | 2019.09.11 |
---|---|
백준1074 - Z (0) | 2019.09.10 |
백준9322 - 철벽 보안 알고리즘 (0) | 2019.09.09 |
백준4949 - 균형잡힌 세상 (0) | 2019.09.08 |
백준3985 - 롤 케이크 (0) | 2019.09.07 |