Hard
Build Array Where You Can Find The Maximum Exactly K Comparisons — C++
Full explanation · Time O(n * m * k) · Space O(m * k)
// Time: O(n * m * k)
// Space: O(m * k)
class Solution {
public:
int numOfArrays(int n, int m, int k) {
static const int MOD = 1e9 + 7;
// dp[l][i][j] = number of ways of constructing array length l with max element i at search cost j
vector<vector<vector<uint64_t>>> dp(2, vector<vector<uint64_t>>(m + 1, vector<uint64_t>(k + 1)));
// prefix_dp[l][i][j] = sum(dp[l][i][j] for i in [1..i])
vector<vector<vector<uint64_t>>> prefix_dp(2, vector<vector<uint64_t>>(m + 1, vector<uint64_t>(k + 1)));
for (uint64_t i = 1; i <= m; ++i) {
dp[1][i][1] = 1;
prefix_dp[1][i][1] = (prefix_dp[1][i - 1][1] + dp[1][i][1]) % MOD;
}
for (uint64_t l = 2; l <= n; ++l) {
for (uint64_t i = 1; i <= m; ++i) {
for (uint64_t j = 1; j <= k; ++j) {
dp[l % 2][i][j] = (i * dp[(l - 1) % 2][i][j] % MOD + prefix_dp[(l - 1) % 2][i - 1][j - 1]) % MOD;
prefix_dp[l % 2][i][j] = (prefix_dp[l % 2][i - 1][j] + dp[l % 2][i][j]) % MOD;
}
}
}
return prefix_dp[n % 2][m][k];
}
};