본문 바로가기
CS/Algorithm

[알고리즘][DP][1010] 다리놓기

by 별토끼. 2018. 4. 13.
반응형
[알고리즘][DP][1010] 다리놓기


* 풀이

 핵심은 선이 겹칠 수 없다는 것이다. 단순히 콤비네이션을 이용하여 풀 수 있지만 DP로 풀어보려하다 삽질을 많이 했다.

 선이 1개일 때와 선이 2개 이상일 때를 구분지었다. 두번째 선부터 선이 겹치지 않는 것을 고려해줘야하기 때문!

 arr[n][m] 가 n에서 m으로 가는 선이라고 했을 때 m은 최소한 n과 같아야 한다. 왜냐하면 n-1, n-2 ...가 선을 하나씩 차지했을 것이기 때문!




* 코드


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
37
package algorithm_DP;
 
import java.util.Scanner;
 
public class q_1010 {
    static int num;
    static int n, m;
    static int[][] arr;
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        num = scan.nextInt();
        while(num-->0) {
 
            n = scan.nextInt();
            m = scan.nextInt();
 
            
            arr = new int[n+1][m+1];
            //1. 선을 하나 그었을 때
            for(int i=0;i<=m;i++) arr[1][i]=i;
            //2. 두번째 선부터 점화식
            for(int i=2;i<=n;i++) {
                for(int j=i;j<=m;j++) {
                    for(int k=j;k>=i;k--) {
                        arr[i][j] += arr[i-1][k-1];
                    }
                }
            }
            System.out.println(arr[n][m]);
        }
        
    }
    
 
 
}
 
cs


반응형

댓글