Skip to content

Commit d3855b3

Browse files
authored
Create build-array-where-you-can-find-the-maximum-exactly-k-comparisons.cpp
1 parent d215c85 commit d3855b3

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Time: O(n * m * k)
2+
// Space: O(m * k)
3+
4+
class Solution {
5+
public:
6+
int numOfArrays(int n, int m, int k) {
7+
static const int MOD = 1e9 + 7;
8+
// dp[l][i][j] = number of ways of constructing array length l with max element i at search cost j
9+
vector<vector<vector<uint64_t>>> dp(2, vector<vector<uint64_t>>(m + 1, vector<uint64_t>(k + 1)));
10+
// prefix_dp[l][i][j] = sum(dp[l][i][j] for i in [1..i])
11+
vector<vector<vector<uint64_t>>> prefix_dp(2, vector<vector<uint64_t>>(m + 1, vector<uint64_t>(k + 1)));
12+
for (uint64_t i = 1; i <= m; ++i) {
13+
dp[1][i][1] = 1;
14+
prefix_dp[1][i][1] = (prefix_dp[1][i - 1][1] + dp[1][i][1]) % MOD;
15+
}
16+
for (uint64_t l = 2; l <= n; ++l) {
17+
for (uint64_t i = 1; i <= m; ++i) {
18+
for (uint64_t j = 1; j <= k; ++j) {
19+
dp[l % 2][i][j] = (i * dp[(l - 1) % 2][i][j] % MOD + prefix_dp[(l - 1) % 2][i - 1][j - 1]) % MOD;
20+
prefix_dp[l % 2][i][j] = (prefix_dp[l % 2][i - 1][j] + dp[l % 2][i][j]) % MOD;
21+
}
22+
}
23+
}
24+
return prefix_dp[n % 2][m][k];
25+
}
26+
};

0 commit comments

Comments
 (0)