공부 자료/알고리즘

(C/C++) 백준 1010번 - 다리 놓기

뚜루뚜루세니 2021. 8. 3. 09:07
728x90

문제출처: https://www.acmicpc.net/problem/1010

 

1010번: 다리 놓기

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

www.acmicpc.net

1. 코드

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
31
32
33
34
35
36
#include <iostream>
#include <algorithm>
 
using namespace std;
int test;
int n, m;
int dp[31][31];
 
//조합 공식
//mCn = m-1Cn+m-1Cn-1
int find(int n, int m) {
    if (dp[m][n] == 0)
        dp[m][n] = find(n, m - 1+ find(n - 1, m - 1);
    return (dp[m][n]); 
}
 
int main() {
    
    scanf("%d"&test);
 
    //test 케이스 별로 배열 초기화 해주기
    for (int i = 0; i < 30; i++)
        for (int j = 0; j < 30; j++)
            dp[i][j] = 0;
 
    for (int i = 0; i < 30; i++) {
        dp[i][i] = 1;
        dp[i][0= 1;
    }
 
    for (int i = 0; i < test; i++) {
        scanf("%d %d"&n, &m);
        printf("%d\n", find(n, m));
    }
    return 0;
}
cs

2. 해결과정

M개에서 N개를 겹치지 않게 뽑는 조합의 문제  mCn을 풀어주면 된다.

점화식은 m-1Cn-1+m-1Cn 성질과 nCn=1, nC0=1를 이용해주면 된다.

테스트 케이스 별로 배열을 초기화 시켜줘야한다.

 

3. 느낀점

처음에는 초기화를 안시켰고, 조합을 구현하는것에 어려움을 느꼈다. dp는 어려워잉

728x90