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 | #include <cstdio> using namespace std; int d[31][31]; // nCr = n-1Cr + n-1Cr-1 int com(int n, int r) { if (d[n][r] > 0) return d[n][r]; if (n == r || r == 0) return 1; else if (n < r) return 0; else { return d[n][r] = com(n - 1, r) + com(n - 1, r - 1); } } int main() { int t; scanf("%d", &t); while (t--) { int n, m; scanf("%d %d", &n, &m); printf("%d\n", com(m, n)); } return 0; } | cs |
6번 줄의 // nCr = n-1Cr + n-1Cr-1 이것을 이용하는 것이 핵심이다.
일반적인 조합의 성질인
이 공식을 이용하여 코드를 짜는 경우 long long int 자료형으로도 29! 을 담을 수 없으므로 불가능한 방법이다.
DP로 풀기로 했으니 그 성질을 이용하여 위와 같이 풀었다.
22번 줄의 printf("%d\n", com(m, n));
com을 호출할 때 인자를 바꿔서 넣어주어야 하는 것을 잊지말 것.
백준 2167 2차원 배열의 합 (0) | 2018.05.18 |
---|---|
백준 2163 초콜릿 자르기 (0) | 2018.05.18 |
백준 1003 피보나치 함수 (0) | 2018.05.18 |
백준 1149 RGB거리 (0) | 2018.05.18 |
백준 1389 케빈 베이컨의 6단계 법칙 (0) | 2018.05.17 |
댓글,
jayharvey
머신러닝/딥러닝 관련 글을 포스팅할 예정입니다 :)