Build Array Where You Can Find The Maximum Exactly K Comparisons

HardDynamic ProgrammingPrefix Sum

Solution

export function numOfArrays(n: number, m: number, k: number): number {
  const MOD = 10 ** 9 + 7;
 
  const dp = new Array(n + 1)
    .fill(undefined)
    .map(() => new Array(m + 1).fill(undefined).map(() => new Array<number>(k + 1).fill(0)));
 
  for (let i = 1; i <= m; i++) {
    dp[1][i][1] = 1;
  }
 
  for (let len = 2; len <= n; len++) {
    for (let maxVal = 1; maxVal <= m; maxVal++) {
      for (let cost = 1; cost <= k; cost++) {
        let sum = 0;
        for (let i = 1; i < maxVal; i++) {
          sum = (sum + dp[len - 1][i][cost - 1]) % MOD;
        }
        dp[len][maxVal][cost] = (dp[len - 1][maxVal][cost] * maxVal + sum) % MOD;
      }
    }
  }
 
  let answer = 0;
  for (let i = 1; i <= m; i++) {
    answer = (answer + dp[n][i][k]) % MOD;
  }
  return answer;
}