알고리즘/백준

[백준] 1010번 : 다리 놓기

bigkwangs 2023. 7. 13. 23:22
728x90

https://www.acmicpc.net/problem/1010

 

1010번: 다리 놓기

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

www.acmicpc.net

다이나믹 프로그래밍으로 문제를 해결하였고 점화식은 dp[n][m] = dp[n-1][m-1] + dp[n-1][m] 으로 도출하였다.

 

테스트 케이스 서쪽노드2, 동쪽노드 4

 

dp[2][4] = d[1][3] + dp[1][4]는 서쪽노드의 첫번째노드가 동쪽의 첫번째 노드와 연결되어있는 경우와 연결되지 않는 경우의 수의 합이다.

 

1. 서쪽첫번째 노드가 동쪽 첫번째 노드와 연결되어 있는경우

  - dp[1][3] 이다. 즉, 서쪽노드에는 1개의 노드와 동쪽노드에는 3개의 노드만 남은 상태임으로 3

2. 서쪽첫번째 노드가 동쪽 첫번째 노드와 연결되어 있지 않는경우

 - dp[1][4] 이다. 즉, 서쪽노드는 1개가 남에되고 동쪽 노드는 4개의 노드가 남은 상태임으로 4

dp[2][4] = 7이라는 결과가 도출된다.

T = int(input())
for _ in range(T):
    N, M = list(map(int, input().split()))
    dp = [[0 for _ in range(N+1)] for _ in range(M+1)]
    for i in range(N+1):
        dp[i][i] = i
    
    for i in range(M+1):
        dp[i][1] = i
        
    for i in range(2, M+1):
        for j in range(2,N+1):
            dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
            
    print(dp[M][N])
728x90