halang-log
💡 PS

[BOJ] 1328 고층 빌딩

date
Mar 9, 2022
slug
boj-1328
author
status
Public
tags
PS
summary
고층 빌딩 문제에 대한 풀이입니다
type
Post
thumbnail
category
💡 PS
updatedAt
Aug 3, 2023 09:08 AM
언어

문제

풀이

우선 높이가 1부터 N까지인 빌딩이 역순으로 정렬되어 있다고 생각하자. ix가 0인 건물의 높이가 N인 것이다. 그렇다면, ix번째 건물을 배치할 때 세 가지의 경우가 있다.
💡
건물의 맨 왼쪽에 배치건물 리스트의 맨 오른쪽에 배치만약, 건물이 두개 이상이 있을 경우, 가장 왼쪽에 있는 건물~가장 오른쪽에 있는 건물 사이에 배치
만약 1번과 2번의 경우 le(가장 왼쪽에서 봤을 때 보이는 빌딩의 수)나 ri(가장 오른쪽에서 봤을 때 보이는 빌딩의 수)값이 하나 증가하게 된다. 왜냐하면, ix번째 건물이 건물 리스트 중 높이가 가장 낮기 때문이다.

코드

#include <cstdio> #include <cstring> #define MOD 1000000007 using namespace std; typedef long long ll; int n, l, r; ll dp[100][100][100]; ll go(int ix, int le, int ri) { if (ix == n) { if (le == l and ri == r) return 1; return 0; } if (dp[ix][le][ri] != -1) return dp[ix][le][ri]; ll ret = 0; if (ix >= 2) ret = go(ix+1, le, ri) * (ix-1) % MOD; ret += go(ix+1, le+1, ri) % MOD + go(ix+1, le, ri+1) % MOD; return dp[ix][le][ri] = ret % MOD; } int main() { memset(dp, -1, sizeof(dp)); scanf("%d %d %d", &n, &l, &r); printf("%lld", go(1, 1, 1)); }