Student Attendance Record II

HardDynamic Programming

Solution

export function checkRecord(n: number): number {
  if (n === 0) {
    return 0;
  }
  if (n === 1) {
    return 3;
  }
 
  const MOD = 10 ** 9 + 7;
  let prev = {
    P: 1,
    L: 1,
    A: 1,
    LL: 0,
    PA: 0,
    LA: 0,
    LLA: 0,
  };
  for (let i = 2; i <= n; i++) {
    const curr = {
      P: (prev.P + prev.L + prev.LL) % MOD,
      L: prev.P % MOD,
      LL: prev.L % MOD,
      A: (prev.P + prev.L + prev.LL) % MOD,
      PA: (prev.PA + prev.LA + prev.LLA + prev.A) % MOD,
      LA: (prev.PA + prev.A) % MOD,
      LLA: prev.LA % MOD,
    };
    prev = curr;
  }
  return Object.values(prev).reduce((acc, value) => (acc + value) % MOD, 0);
}