티스토리 뷰
https://www.acmicpc.net/problem/1328
D[N][L][R] = 각각 1~N의 높이를 가진 빌딩을 세웠을 때 가장 왼쪽에서 L개, 가장 오른쪽에서 R개의 빌딩이 보이는 경우의 수
D[N][L][R] = D[N-1][L-1][R] + D[N-1][L][R-1] + D[N-1][L][R]*(N-2)
1~N-1의 높이를 가진 빌딩의 경우의 수에서 높이를 1씩 높여주면 2~N의 높이를 가진 빌딩의 경우의 수가 나온다.
2~N의 높이를 가진 빌딩에서 1를 가장 왼쪽에 추가, 가장 오른쪽에 추가, 그 외 사이에 추가하는 경우의 수를 합한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <cstdio>
long long n,l,r,i,j,k,d[105][105][105];
int main()
{
scanf("%lld %lld %lld",&n,&l,&r);
d[1][1][1]=1;
for(i=2;i<=n;i++)
{
for(j=1;j<=l;j++)
{
for(k=1;k<=r;k++)
{
d[i][j][k]=d[i-1][j-1][k]+d[i-1][j][k-1]+d[i-1][j][k]*(i-2);
d[i][j][k]%=1000000007;
}
}
}
printf("%lld",d[n][l][r]);
return 0;
}
|
cs |
'Algorithm > BOJ' 카테고리의 다른 글
2133 타일 채우기 (0) | 2019.10.13 |
---|---|
12969 ABC (0) | 2019.10.13 |
10942 팰린드롬? (0) | 2019.10.12 |
1890 점프 (0) | 2019.10.12 |
11048 이동하기 (0) | 2019.10.12 |