Problem
You are given three integers n
, m
and k
. Consider the following algorithm to find the maximum element of an array of positive integers:
You should build the array arr which has the following properties:
arr
has exactlyn
integers.1 <= arr[i] <= m
where(0 <= i < n)
.After applying the mentioned algorithm to
arr
, the valuesearch_cost
is equal tok
.
Return the number of ways to build the array arr
under the mentioned conditions. As the answer may grow large, the answer must be computed modulo 10^9 + 7
.
Example 1:
Input: n = 2, m = 3, k = 1
Output: 6
Explanation: The possible arrays are [1, 1], [2, 1], [2, 2], [3, 1], [3, 2] [3, 3]
Example 2:
Input: n = 5, m = 2, k = 3
Output: 0
Explanation: There are no possible arrays that satisify the mentioned conditions.
Example 3:
Input: n = 9, m = 1, k = 1
Output: 1
Explanation: The only possible array is [1, 1, 1, 1, 1, 1, 1, 1, 1]
Constraints:
1 <= n <= 50
1 <= m <= 100
0 <= k <= n
Solution
class Solution {
private static final int MOD = 1_000_000_007;
public int numOfArrays(int n, int m, int k) {
long[][] ways = new long[m + 1][k + 1];
long[][] sums = new long[m + 1][k + 1];
for (int max = 1; max <= m; max++) {
ways[max][1] = 1;
sums[max][1] = ways[max][1] + sums[max - 1][1];
}
for (int count = 2; count <= n; count++) {
long[][] ways2 = new long[m + 1][k + 1];
long[][] sums2 = new long[m + 1][k + 1];
for (int max = 1; max <= m; max++) {
for (int cost = 1; cost <= k; cost++) {
long noCost = max * ways[max][cost] % MOD;
long newCost = sums[max - 1][cost - 1];
ways2[max][cost] = (noCost + newCost) % MOD;
sums2[max][cost] = (sums2[max - 1][cost] + ways2[max][cost]) % MOD;
}
}
ways = ways2;
sums = sums2;
}
return (int) sums[m][k];
}
}
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).