문제 링크: https://www.acmicpc.net/problem/1010

 

다리를 놓아야 하는데 겹칠 수 없게 놓아야 한다고 합니다.

문제를 약간 다르게 생각해보면, 동쪽 도시중에 다리를 놓지 않을 M-N개 도시를 구하면 됩니다. 그러면 아래와 같이 식을 세울 수 있습니다.

\[_M \mathrm{C} _{M-N} = \binom{M}{M-N} \]

이항계수 문제로 바꿀 수 있는데 이항계수를 DP로 구현하면 끝입니다.

그런데 이 문제는 N, M의 최대값이 30으로 적기 때문에 dp를 안쓰고 백트래킹으로 풀어도 통과는 될 듯 합니다 (아마도)

#pragma GCC optimize ("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,avx2")

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;


const int INF = 987654321;
typedef long long ll;


int dp[31][31];

int bino(int n, int r) {
	if (r == 0 || n == r) return 1;

	int &ret = dp[n][r];
	if (ret != -1) return ret;

	ret = bino(n - 1, r - 1) + bino(n - 1, r);

	return ret;
}

int main()
{
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
#endif

	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	memset(dp, -1, sizeof(dp));

	int t;
	cin >> t;
	while (t--) {
		int n, m;
		cin >> n >> m;
		cout << bino(m, m - n) << '\n';
	}
	
	return 0;
}

top-down 방식으로 풀어봤습니다

반응형

'Online Judge > 백준' 카테고리의 다른 글

[백준][C++] 1550: 16진수  (0) 2020.06.11
[백준][C++] 1012: 유기농 배추  (0) 2020.06.10
[백준][C++] 9461: 파도반 수열  (0) 2020.06.05
[백준][C++] 1041: 주사위  (0) 2020.06.03
[백준][C++] 10888: 두 섬간의 이동  (0) 2020.06.02