790. 多米诺和托米诺平铺

有两种形状的瓷砖:一种是 2x1 的多米诺形,另一种是形如 “L” 的托米诺形。两种形状都可以旋转。

XX <- 多米诺

XX <- “L” 托米诺

X

给定 N 的值,有多少种方法可以平铺 2 x N 的面板?返回值 mod 10^9 + 7。

(平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同,当且仅当面板上有四个方向上的相邻单元中的两个,使得恰好有一个平铺有一个瓷砖占据两个正方形。)

示例:

输入: 3

输出: 5

解释:

下面列出了五种不同的方法,不同字母代表不同瓷砖:

XYZ XXZ XYY XXY XYY

XYZ YYZ XZZ XYY XXY

提示:

N 的范围是 [1, 1000]

class Solution {

    //dp[i][0]是第n行,并且是平铺
//dp[i][1]是第n行,不平铺的 // public int numTilings(int N) {
// long[][] dp = new long[N+1][3];
// dp[0][0] = 1;
// dp[0][1] = 0;
// int MOD = 1000000007;
// for(int i = 1 ; i <= N ; ++i){
// long temp = i < 2 ? 0 : dp[i -2][0];
// dp[i][0] = (temp + dp[i-1][0] + 2 * dp[i-1][1]) % MOD;
// dp[i][1] = (temp +dp[i-1][1]) % MOD;
// }
// return (int)dp[N][0];
// } public int numTilings(int N) {
int mod = 1000000007;
int[] dp = new int[N+3];
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
dp[3] = 5;
for(int i = 4; i <= N; i++){
//这里全是平铺的,
//我当前这一位,可以是我上一位平铺的+一个2*1的,
//我可以把1*2的放到最上面,也可以放在最下面,是两种可能,所以*2
//还可以是我三位前的那个,因为可以是两个L
//但这里,我开头或者结尾可能是L的,如果我们在那个基础上加上L
//可能会导致重复,以至于要/2,也就变成了三位前的那个*2/2==1
dp[i] = (2*(dp[i-1] % mod) % mod + dp[i-3] % mod) % mod;
}
return dp[N] % mod;
} }

最新文章

  1. redis的 rdb 和 aof 持久化的区别 [转]
  2. C++学习笔记22:设备
  3. hdu 4638 Group
  4. c++语法集锦
  5. js获取当期日期累加天数
  6. windows server system32下常见快捷指令
  7. 【Java基础】常用基础--从键盘中得到一个字符串
  8. .net 控件开发第二天 怎么将 第一天写的代码 用到 .net中来
  9. Counting Intersections
  10. section元素与div、article元素的区别
  11. connected standby
  12. Sql Server并发和事务
  13. Linux sar工具安装使用
  14. Cannot send, channel has already failed: tcp://127.0.0.1:8161
  15. c语言字符串函数大全(转)
  16. 在windows下安装配置python开发环境及Ulipad开发工具(转)
  17. 推荐20款JavaScript框架给前端开发者
  18. 禁止页面内按F5键进行刷新(扩展知识:禁止复制信息内容)
  19. express 重新加载
  20. 洛谷P3203弹飞绵羊

热门文章

  1. Coursera课程笔记----计算导论与C语言基础----Week 7
  2. dp规划之矩阵连乘问题
  3. python --分隔符split()
  4. Mockito如何mock一条链式调用
  5. 简单mysql存储过程
  6. 安装的SQL Server2008 R2版的连接不到本地数据,提示未找到或无法访问服务器。----复制自百度知道
  7. 存储系列之 RAID技术原理简介
  8. 关于mobileSelect.js日期数据获取封装,动态时间,封装
  9. MyBatis通过注解方式批量添加、修改、删除
  10. 又抓了一个导致频繁GC的鬼--数组动态扩容