백준 1010 다리 놓기
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] > 0return d[n][r];
    if (n == r || r == 0return 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을 호출할 때 인자를 바꿔서 넣어주어야 하는 것을 잊지말 것.     




'Algorithm' 카테고리의 다른 글

백준 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

머신러닝/딥러닝 관련 글을 포스팅할 예정입니다 :)