제출 #1193922

#제출 시각아이디문제언어결과실행 시간메모리
1193922Ghulam_JunaidSkyscraper (JOI16_skyscraper)C++20
100 / 100
114 ms105572 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 105, MXL = 1005, mod = 1e9 + 7;
int n, L, a[N];
ll dp[N][N][MXL][4];

int main(){
    cin >> n >> L;
    for (int i = 1; i <= n; i ++)
        cin >> a[i];
    sort(a + 1, a + n + 1);

    dp[1][1][0][0] = 1;
    dp[1][1][0][1] = 2;
    dp[1][1][0][2] = 1;

    for (int i = 1; i < n; i ++){
        for (int j = 1; j <= i; j ++){
            for (int k = 0; k < 3; k ++){
                int cost = (a[i + 1] - a[i]) * (2 * j - k);
                for (int l = cost; l <= L; l ++){
                    dp[i + 1][j - 1][l][k] += dp[i][j][l - cost][k] * (j - 1);
                    dp[i + 1][j - 1][l][k] %= mod;

                    dp[i + 1][j][l][k] += dp[i][j][l - cost][k] * (2 * j - k);
                    dp[i + 1][j][l][k] %= mod;

                    dp[i + 1][j][l][k + 1] += dp[i][j][l - cost][k] * (2 - k);
                    dp[i + 1][j][l][k + 1] %= mod;

                    dp[i + 1][j + 1][l][k] += dp[i][j][l - cost][k] * (j + 1 - k);
                    dp[i + 1][j + 1][l][k] %= mod;

                    dp[i + 1][j + 1][l][k + 1] += dp[i][j][l - cost][k] * (2 - k);
                    dp[i + 1][j + 1][l][k + 1] %= mod;
                }
            }
        }
    }

    ll ans = 0;
    for (int i = 0; i <= L; i ++)
        ans += dp[n][1][i][2];
    ans %= mod;

    cout << ans << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...