[白俊]1328号高層ビル(c++)


[白俊]1328号高層ビル


質問リンク:https://www.acmicpc.net/problem/1328

問題とI/O



質問へのアクセス


どうしても思い出せないので、他人のブログを参考にしました.
従来のビルの数からビルの高さを一つ一つ上げると仮定します.そして、高いビルを置く場所を探せばいいです.一番左と一番右の場合はそれぞれ左から見て、右の場合はそれぞれ1を加えます.
両端の部分ではなく、見える数に変化はないので、置ける位置はi-2です.
点火式:dp[i][k]=cache[i-1][j-1][k]+cache[i][j][k-1]+cache[i-1][j][k]*(i-2)

コード実装(C++)

#include<iostream>

using namespace std;

typedef long long ll;
ll mod = 1e9 + 7;
ll cache[102][102][102];

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);

    int N, L, R;
    cin >> N >> L >> R;
    
    cache[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++){
                cache[i][j][k] = (cache[i-1][j-1][k] + cache[i-1][j][k-1] + cache[i-1][j][k] * (i-2)) % mod;
            }
        }
    }
    cout << cache[N][L][R] << "\n";
}