LeetCode-in-Java

1420. Build Array Where You Can Find The Maximum Exactly K Comparisons

Hard

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:

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 109 + 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:

Solution

public 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];
    }
}