코딩테스트/백준
[백준][C++]1328번 고층 빌딩
윤깡패
2023. 10. 12. 16:28
문제
https://www.acmicpc.net/problem/1328
1328번: 고층 빌딩
상근이가 살고있는 동네에는 빌딩 N개가 한 줄로 세워져 있다. 모든 빌딩의 높이는 1보다 크거나 같고, N보다 작거나 같으며, 같은 높이를 가지는 빌딩은 없다. 상근이는 학교 가는 길에 가장 왼
www.acmicpc.net
풀이
- 점화식 정의
D[N][L][R] : N개의 빌딩이 있고 왼쪽에서 L개, 오른쪽에서 R개가 보일 때 가능할 경우의 수
- 점화식 도출
: 가장 작은 빌딩 배치
- D[N - 1][L - 1][R] : N - 1개의 빌딩에서 왼쪽에 빌딩을 추가할 때 왼쪽 빌딩이 1개 증가
- D[N - 1][L][R - 1] : N -1개의 빌딩에서 오른쪽에 빌딩을 추가할 때 오른쪽 빌딩이 1개 증가
- D[N - 1][L][R] * (N - 2) : N -1개의 빌딩에서 가운데 빌딩을 추가할 때 증가 수가 없지만, N - 2개의 위치에 배치
⇒ D[N][L][R] = D[N - 1][L - 1][R] + D[N - 1][L][R - 1] + D[N - 1][L][R] * (N - 2)
- DP 테이블 초기화
D[1][1][1] = 1
동적 계획법(Dynamic Programming) 알고리즘
동적 계획법(Dynamic Programming) 알고리즘
동적 계획법(Dynamic Programming) 알고리즘 한 번 해결된 부분 문제의 정답을 메모리에 기록하여, 한 번 계산한 답은 다시 계산하지 않도록 하는 문제 해결 기법 동적 계획법 알고리즘 핵심 이론 1. 큰
soobin0821.tistory.com
코드
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, L, R;
cin >> N >> L >> R;
long building[101][101][101] = {0};
building[1][1][1] = 1; // 빌딩이 1개이면 놓을 수 있는 경우의 수는 1개
for(int n = 2; n <= N; n++)
{
for(int l = 1; l <= n; l++)
{
for(int r = 1; r <= n; r++)
{
building[n][l][r] = (building[n - 1][l - 1][r] + building[n - 1][l][r - 1] + (n - 2) * building[n - 1][l][r]) % 1000000007;
}
}
}
cout << building[N][L][R];
return 0;
}
오답
더보기
#include <iostream>
using namespace std;
static int N, L, R;
static long mod = 1000000007;
static long D[101][101][101];
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> L >> R;
D[1][1][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++)
{
D[i][j][k] = (D[i - 1][j][k] * (i - 2) + (D[i - 1][j][k - 1] + D[i - 1][j - 1][k])) % mod;
}
}
}
cout << D[N][L][R] << "\n";
}
728x90