코딩테스트/Baekjoon

[백준 #1010] 다리 놓기 (C++)

동띵 2021. 9. 6. 15:03

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

 

1010번: 다리 놓기

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.

www.acmicpc.net

 

강의 서쪽에는 n개의 사이트, 동쪽에는 m개의 사이트가 있고

이를 연결한 다리를 최대한 많이 짓기 위해

n개의 다리를 지으려고 할 때의 경우의 수를 구하는 문제이다.

 

m개 중에서 순서에 상관없이 n개를 선택하는 것이기 때문에

조합을 사용하여 문제를 풀었다.

 

n, m 순서로 입력받지만 

m개 중에서 n개를 선택하는 것이므로 

mCn = m-1Cn-1 + m-1Cn로 문제를 풀어야 한다.

 

#include <iostream>
using namespace std;

int dp[30][30];
int comb(int m, int n) {
	if (dp[m][n] > 0) return dp[m][n];
	if (m == n || n == 0) return 1;
	else {
		dp[m][n] = comb(m - 1, n - 1) + comb(m - 1, n);
		return dp[m][n];
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int t, n, m;
	cin >> t;
	for (int i = 0; i < t; i++) {
		cin >> n >> m;
		cout << comb(m, n) << "\n";
	}
	return 0;
}

'코딩테스트 > Baekjoon' 카테고리의 다른 글

[백준 #10972] 다음 순열 (C++)  (0) 2021.09.08
[백준 #10973] 이전 순열 (C++)  (1) 2021.09.07
[백준 #2702] 초6 수학 (C++)  (0) 2021.09.03
[백준 #2675] 문자열 반복 (C++)  (0) 2021.09.01
[백준 #2908] 상수 (C++)  (0) 2021.09.01