Count Number of Ways to Place Houses

medium dp

Problem

There is a street with n plots on each side of the road. On each side, you may build houses such that no two houses are on adjacent plots. The two sides are independent. Return the number of ways to place houses, modulo 10^9 + 7.

Inputn = 3
Output25
One side has f(3) = 5 valid arrangements (Fibonacci). Two independent sides give 5 × 5 = 25.

def count_houses_placements(n):
    MOD = 10**9 + 7
    # f[k] = ways to fill k plots on one side (no two adjacent)
    f = [0] * (n + 1)
    f[0] = 1
    f[1] = 2
    for k in range(2, n + 1):
        f[k] = (f[k - 1] + f[k - 2]) % MOD
    return (f[n] * f[n]) % MOD
function countHousePlacements(n) {
  const MOD = 1000000007n;
  const f = new Array(n + 1).fill(0n);
  f[0] = 1n;
  if (n >= 1) f[1] = 2n;
  for (let k = 2; k <= n; k++) {
    f[k] = (f[k - 1] + f[k - 2]) % MOD;
  }
  return Number((f[n] * f[n]) % MOD);
}
class Solution {
    public int countHousePlacements(int n) {
        long MOD = 1_000_000_007L;
        long[] f = new long[n + 1];
        f[0] = 1;
        if (n >= 1) f[1] = 2;
        for (int k = 2; k <= n; k++) {
            f[k] = (f[k - 1] + f[k - 2]) % MOD;
        }
        return (int)((f[n] * f[n]) % MOD);
    }
}
int countHousePlacements(int n) {
    const long long MOD = 1000000007LL;
    vector<long long> f(n + 1, 0);
    f[0] = 1;
    if (n >= 1) f[1] = 2;
    for (int k = 2; k <= n; k++) {
        f[k] = (f[k - 1] + f[k - 2]) % MOD;
    }
    return (int)((f[n] * f[n]) % MOD);
}
Time: O(n) Space: O(n)