페이지

1328번: 고층 빌딩

https://www.acmicpc.net/problem/1328


$O(nlr)$

가장 작은 빌딩을 어디에 놓을지에 따라 전 dp항을 합해주면 된다.
dp[1][1][1]=1
dp[n][l][r]=dp[n-1][l][r]*(n-2)+dp[n-1][l-1][r]+dp[n-1][l][r-1]


#include<cstdio>
#define mod 1000000007
int n, l, r, dp[101][101];
int main() {
    scanf("%d%d%d", &n, &l, &r);
    dp[1][1] = 1;
    for (int i = 2; i <= n; i++) for (int j = l; j; j--) for (int k = r; k; k--)
        dp[j][k] = ((long long)dp[j][k] * (i - 2) + dp[j - 1][k] + dp[j][k - 1]) % mod;
    printf("%d", dp[l][r]);
    return 0;
}

댓글 없음 :

댓글 쓰기