Submission #1178399

#TimeUsernameProblemLanguageResultExecution timeMemory
1178399ericl23302Skyscraper (JOI16_skyscraper)C++20
5 / 100
616 ms99652 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n, l;
vector<int> heights;
vector<vector<vector<int>>> dp;

int doDp(int bitmask, int last, int tot) {
    if (dp[bitmask][last][tot] != -1) return dp[bitmask][last][tot];
    int prevBitmask = bitmask - (1 << last);
    dp[bitmask][last][tot] = 0;
    for (int i = 0; i < n; ++i) {
        if (!((1 << i) & prevBitmask) || tot < abs(heights[i] - heights[last])) continue;
        dp[bitmask][last][tot] += doDp(prevBitmask, i, tot - abs(heights[i] - heights[last]));
    }
    return dp[bitmask][last][tot];
}

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

    cin >> n >> l;
    heights.resize(n);
    for (int &i : heights) cin >> i;
    // sort(heights.begin(), heights.end());
    dp.resize((1 << n), vector<vector<int>>(n, vector<int>(l + 1, -1)));
    for (int i = 0; i < n; ++i) {
        for (int j = 1; j <= l; ++j) dp[(1 << i)][i][j] = 0;
        dp[(1 << i)][i][0] = 1;
    }

    int res = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j <= l; ++j) {
            res += doDp((1 << n) - 1, i, j);
            // cout << i << ' ' << j << ' ' << doDp((1 << n) - 1, i, j) << '\n';
            res %= 1'000'000'009;
        }
    }

    cout << res << '\n';

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...