티스토리 뷰

728x90

문제 링크

https://www.acmicpc.net/problem/1010



다음과 같은 그림에서 서쪽 사이트의 개수만큼 다리를 지으려 할 때 겹치지 않게 다리를 모두 지을 수 있는 경우의 수를 구해야 한다.





다리끼리는 서로 겹쳐질 수 없다라는 조건이 있다.


이런 경우는 가능하지만




이런 경우는 불가능하다는 것이다.



서쪽 사이트의 집합을 A, 동쪽 사이트의 집합을 B라 하면 

1i,jN i,j

1x,yM x,y에 대해 

A[i]B[x],A[j]B[y]가 연결된다면 항상 i<j이고 x<y여야 한다.


쉽게 말하면 서쪽의 두 정점과 동쪽의 두 정점이 연결된다면 항상 순서대로 연결되어야 한다는 말이다.

확장해서, 서쪽과 동쪽에서 각각 정확히 N개의 정점을 선택할 때 양쪽의 정점은 항상 순서대로 연결되게 된다.


서쪽의 정점 N개는 모두 선택되어야 하고, 동쪽의 사이트 M개 중에서 어떤 N개의 정점을 선택했을 때 다리를 지을 수 있는 방법의 수는 항상 1이다.


따라서 우리는 이 문제를 M개 중 N개를 고르는 경우의 수를 구하는 문제로 단순화할 수 있다.

이는 결국 조합 mCn 이 몇인가를 묻는 문제이다.



정답 코드

#include <iostream>
#include <cstring>
using namespace std;
int t;
int d[31][31];
int foo(int n, int r) {
if (n == r || r == 0)
return 1;
if (d[n][r]) return d[n][r];
return d[n][r] = foo(n - 1, r - 1) + foo(n - 1, r);
}
int main() {
cin >> t;
while (t--) {
memset(d, 0, sizeof(d));
int n, m;
cin >> n >> m;
cout << foo(m, n) << '\n';
}
}
view raw 1010.cpp hosted with ❤ by GitHub


728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함