Number of Dice Rolls With Target Sum

MediumDynamic Programming

Solution

export function numRollsToTarget(n: number, k: number, target: number): number {
  const MOD = 10 ** 9 + 7;
  const memo = new Map<string, number>();
  const key = (n: number, target: number) => `${n}-${target}`;
 
  function dp(n: number, target: number) {
    if (n === 0) {
      return 0 < target ? 0 : 1;
    }
    if (memo.has(key(n, target))) {
      return memo.get(key(n, target)) || 0;
    }
    let ret = 0;
    for (let i = Math.max(0, target - k); i < target; i++) {
      ret += dp(n - 1, i) % MOD;
    }
    memo.set(key(n, target), ret % MOD);
    return ret % MOD;
  }
 
  return dp(n, target) % MOD;
}