반응형

문제 출처 :


https://swexpertacademy.com/main/learn/course/subjectDetail.do?subjectId=AWWxyRM6AhMDFAW4



알고리즘 분석 :


문제 해결에 필요한 사항

1. Dynamic Programming

2. 점화식 세우는 방법


만약 1인 건물을 N - 1개의 건물에서 제일 앞으로 추가한다면 왼쪽에서 보는 건물의 수가 증가할 것이다.


이렇게 맨 앞에 추가할 수 있는 경우의 수는 dp[N - 1][L - 1][R] 일 것이다.


dp[N - 1][L - 1][R]에서 제일 왼쪽에 높이 1의 건물을 추가하면 N - 1 + 1이 되고 L - 1 + 1이 되기 때문이다.


이와 마찬가지로 가장 오른쪽에 건물을 추가할 수도 있는데 그 경우는 dp[N - 1][L][R - 1]가 된다.


그리고 중간에 건물을 추가한다면 높이가 1이기 때문에 어느 곳에든 추가해도 왼쪽, 오른쪽에서 보이는 건물의 수는 그대로다.


즉 dp[N - 1][L][R]의 수가 가장 양 옆을 제외한 N - 2개가 생긴다.


결국 점화식은 다음과 같다.


dp[N][L][R] = dp[N - 1][L - 1][R] + dp[N - 1][L][R - 1] + dp[N - 1][R][L] * (N - 2)



이 문제는 백준 빌딩 세우기 문제와 같다.


https://kswims.tistory.com/175






소스 코드 : 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
typedef long long ll;
 
ll dp[22][22][22];
 
int main() {
    int tCase;
    scanf("%d"&tCase);
    dp[1][1][1= 1;
    for (int i = 2; i <= 20; i++)
        for (int j = 1; j <= 20; j++)
            for (int k = 1; k <= 20; k++)
                dp[i][j][k] = dp[i - 1][j - 1][k] + dp[i - 1][j][k - 1+( (i - 2)*dp[i - 1][j][k]);
            
    for (int tc = 1; tc <= tCase; tc++) {
        int n, l, r;
        scanf("%d %d %d"&n, &l, &r);
        
        printf("#%d %lld\n", tc, dp[n][l][r]);
    }
    return 0;
}
 
cs


반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[SwExpertAcademy] 아나그램  (0) 2020.01.04
[17142번] 연구소 3  (0) 2019.12.27
[SwExpertAcademy] 최대 부분 배열  (0) 2019.11.06
[Programmers] 섬 연결하기  (0) 2019.10.23
[3780번] Corporative Network  (0) 2019.10.17