PS

BOJ 1328 - 고층 빌딩

728x90

www.acmicpc.net/problem/1328

 

1328번: 고층 빌딩

상근이가 살고있는 동네에는 빌딩 N개가 한 줄로 세워져 있다. 모든 빌딩의 높이는 1보다 크거나 같고, N보다 작거나 같으며, 같은 높이를 가지는 빌딩은 없다. 상근이는 학교 가는 길에 가장 왼

www.acmicpc.net

 

이 문제는 DP 를 이용해야 풀 수 있는 문제이다.

 

DP[i][j][k] = w : 지은 건물이 i 개 이며, 왼쪽에서 j 개의 건물이 보이고, 오른쪽에서 k 개의 건물이 보일때, 가능한 총 경우의 수가 w 이다. 

 

건물을 지을때, 가장 높이가 높은거 부터 가장 높이가 작은 1인 건물을 제일 마지막에 짓는다고 가정할때, 3개의 경우의 수가 생긴다

 

1) 가장 왼쪽에 건물을 짓는다. (DP[i - 1][j - 1][k])

: 건물의 크기가 1 이므로, 왼쪽에서 볼때만 수가 하나 증가한다. 

 

 

2) 가장 오른쪽에 건물을 짓는다 (DP[i - 1][j][k - 1])

: 마찬가지로 건물의 크기가 1이므로, 오른쪽에서 볼때만 갯수가 하나 증가한다.

 

 

3) 양 끝이 아닌 중간에 세울 때 (DP[i - 1][j][k] * (i  - 2))

: 중간에 놓을때는, 양 끝을 제외한 i - 2 개 의 경우의 수가 존재한다

 

 

- 참고 : octorbirth.tistory.com/254

 

[BOJ] 백준 1328 고층빌딩

출처: https://www.acmicpc.net/problem/1328 How to Solve? #DP 1~N까지의 높이를 가지는 빌딩이 일직선상에 존재합니다. (같은 높이 존재 X) 왼쪽에서 보여지는 빌딩 개수 L과 오른쪽에서 보여지는 빌딩 개수 R..

octorbirth.tistory.com

 

DP 는 거의 혼자서 풀 수 있는 문제가 없는것 같다.

 

 

- c++

#include <bits/stdc++.h>
 
using namespace std;
 
const int MOD = 1e9+7;
int N, L, R;
// dp[i][j][k] = w : 건물이 i 개 이고, 왼쪽과 오른쪽에서 각각 j, k 개가 보이는 경우 가능한 총 경우의 수가 w. 
int dp[101][101][101];
 
int main() {
    cin.tie(0); ios_base::sync_with_stdio(0);
    
    cin >> N >> L >> R;
    dp[1][1][1= 1;
    
    for (int i = 2; i <= N; ++i) {
        for (int j = 1; j <= L; ++j) {
            for (int k = 1; k <= R; ++k) {
                dp[i][j][k] = ((long long)dp[i - 1][j][k] * (i - 2+ dp[i - 1][j][k - 1+ dp[i - 1][j - 1][k]) % MOD;
            }
        }
    }
    
    cout << dp[N][L][R];
    
    return 0;
}
cs

 

 

728x90

'PS' 카테고리의 다른 글

BOJ 16681 - 등산  (0) 2021.01.31
BOJ 1941 - 소문난 칠공주  (0) 2021.01.31
BOJ 5719 - 거의 최단 경로  (0) 2021.01.31
BOJ 10217 - KCM Travel  (0) 2021.01.31
BOJ 2812 - 크게 만들기  (0) 2021.01.24