알고리즘/BOJ

백준 1328번 고층 빌딩

꾸준함. 2018. 5. 10. 13:08

문제 링크입니다: https://www.acmicpc.net/problem/1328


3가지 경우의 수를 고려해야합니다.

1. N-1 높이의 빌딩을 좌측과 우측을 제외한 곳에 추가하면 L과 R은 그대로입니다.

2. N-1 높이의 빌딩을 좌측에 추가하면 L은 하나 증가합니다.

3. N-1 높이의 빌딩을 우측에 추가하면 R은 하나 증가합니다.


#include <iostream>

#include <cstring> //memset

using namespace std;

 

const long long MOD = 1000000007;

const int MAX = 100 + 1; //1<=N<=100

 

int N, L, R;

long long cache[MAX][MAX][MAX];

 

long long numOfWays(int buildingNum, int left, int right)

{

        //기저 사례: 오름차순, 내림차순

        if ((left == 1 && right == buildingNum) || (left == buildingNum && right == 1))

                 return 1;

        //불가능한 경우

        if (buildingNum == 0 || left == 0 || right == 0)

                 return 0;

 

        long long &result = cache[buildingNum][left][right];

        if (result != -1)

                 return result;

 

        result = 0;

        //1. 좌측과 우측을 제외한 곳에 추가하면 그대로

        //2. N-1 높이를 가진 건물을 우측에 추가하면 우측에서 보이는 건물 증가

        //3. N-1 높이를 가진 건물을 좌측에 추가하면 좌측에서 보이는 건물 증가

        result = ((numOfWays(buildingNum - 1, left, right) * (buildingNum - 2)) + numOfWays(buildingNum - 1, left - 1, right) + numOfWays(buildingNum - 1, left, right - 1)) % MOD;

 

        return result;

}

 

int main(void)

{

        cin >> N >> L >> R;

       

        memset(cache, -1, sizeof(cache));

 

        cout << numOfWays(N, L, R) % MOD << endl;

 

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 2864번 5와 6의 차이  (0) 2018.05.10
백준 2624번 동전 바꿔주기  (0) 2018.05.10
백준 1016번 제곱 ㄴㄴ 수  (0) 2018.05.09
백준 1026번 보물  (0) 2018.05.09
백준 1075번 나누기  (0) 2018.05.09