790. Domino and Tromino Tiling [JavaScript]

一、解题思路

  这是一道典型的动态规划题目。

  首先总结一下最终可以通过补上哪些形状形成完整的图案:

  第一种
    o
    o

  第二种
    oo
    xx

  第三种
    xx
     x
  
  第四种

     x
    xx

  由上述四种情况,可以总结前一个状态有三种情况:完整图案、第一行多一个格子和第二行多一个格子。那么可以定义状态:

  dp[i][0]第i列完整图案的数量
  dp[i][1]第i列第一行多一个的图案数量
  dp[i][2]第i列第二行多一个的图案数量

  那么dp[i][0]的状态转移方程为:

  dp[i][0] = dp[i - 1][0] + dp[i - 2][0] + dp[i - 1][1] + dp[i - 1][2]

  对于dp[i][1]和dp[i][2],大家可以自己列举一下组成的情况,这里不再赘述:

  dp[i][1] = dp[i - 2][0] + dp[i - 1][2]
  dp[i][2] = dp[i - 2][0] + dp[i - 1][1]

二、代码实现

const kMod = 10 ** 9 + 7
const numTilings = N => {
  const dp = []
  dp[0] = [1, 0, 0]
  dp[1] = [1, 0, 0]

  for (let i = 2; i <= N; i++) {
    dp[i] = []

    dp[i][0] = (dp[i - 1][0] + dp[i - 2][0] + dp[i - 1][1] + dp[i - 1][2]) % kMod
    dp[i][1] = (dp[i - 2][0] + dp[i - 1][2]) % kMod
    dp[i][2] = (dp[i - 2][0] + dp[i - 1][1]) % kMod
  }

  return dp[N][0]
}

  
  ----------------------------

关注「漫谈大前端」
不断成长为一名优秀的前端开发工程师

  ----------------------------
  

  您还可以在这些地方找到我:

猜你喜欢

转载自blog.csdn.net/dai_qingyun/article/details/88606404