当前位置: 首页 > news >正文

LeetCode、790. 多米诺和托米诺平铺【中等,二维DP,可转一维】

文章目录

  • 前言
  • LeetCode、790. 多米诺和托米诺平铺【中等,二维DP,可转一维】
    • 题目与分类
    • 思路
      • 二维解法
      • 二维转一维
  • 资料获取

前言

博主介绍:✌目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。

涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。

博主所有博客文件目录索引:博客目录索引(持续更新)

视频平台:b站-Coder长路


LeetCode、790. 多米诺和托米诺平铺【中等,二维DP,可转一维】

题目与分类

题目链接:LeetCode、790. 多米诺和托米诺平铺

分类:动态规划/线性DP


思路

思路描述:以第i列来作为递推形式,初始第一列(二行一列)是固定满的,目的就是初始化,之后每一列(可以说每一组)都是基于上一列的四个状态来与当前可组合的多米诺和托米诺来构成新的一种组合。

下面是多米诺和托米诺的各种状态:

image-20240205211326549

下面图示i位置的多个图案右边的序号下每一个正方形其中的第一列就指的是上一层四个状态中的其中一个状态,根据当前应该成为的状态来看是否可以添加一个多米诺和托米诺来组成当前所属的状态,经过n轮这样子推导,最终即可推导得到所有满平铺的方案数量。

image-20240205210 331776


二维解法

复杂度分析:时间复杂度O(n);空间复杂度O(n)

class Solution {public static final int MOD = 1000000007;//按照【列】来进行递推方程 提前设置好每一列的状态情况//n最大1000//dp[0][0-2] = 0  dp[0][3] = 1//递推:n列  i为列//   dp[i][0] = dp[i - 1][3]//   dp[i][1] = dp[i - 1][0] + dp[i - 1][2]//   dp[i][2] = dp[i - 1][0] + dp[i - 1][1]//   dp[i][3] = dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][3]public int numTilings(int n) {int[][] dp  = new int[n + 1][4];//初始化dp[0][3] = 1;//递推for (int i = 1; i <= n; i ++) {dp[i][0] = dp[i - 1][3] % MOD;dp[i][1] = MODD(dp[i - 1][0], dp[i - 1][2]);dp[i][2] = MODD(dp[i - 1][0], dp[i - 1][1]);dp[i][3] = MODD(MODD(dp[i - 1][0], dp[i - 1][1]), MODD(dp[i - 1][2], dp[i - 1][3]));}return dp[n][3];}// 对两个int进行取%public int MODD(int a, int b) {return (a + b) % MOD;}
}

image-20240205205810571


二维转一维

说明:可以看到当前题解是基于二维DP来推导的,在二维中我们可以看到当前层每次计算新的数量值时之后使用到上一层,那么就i很容易的二维转一维。

复杂度分析:时间复杂度O(n);空间复杂度O(1)

class Solution {public static final int MOD = 1000000007;//二维转一维public int numTilings(int n) {int t1 = 0, t2 = 0, t3 = 0, t4 = 1;//递推for (int i = 1; i <= n; i ++) {int tmp1 = t1, tmp2 = t2, tmp3 = t3, tmp4 = t4;t1 = tmp4 % MOD;t2 = MODD(tmp1, tmp3);t3 = MODD(tmp1, tmp2);t4 = MODD(MODD(tmp1, tmp2), MODD(tmp3, tmp4));}return t4;}// 对两个int进行取%public int MODD(int a, int b) {return (a + b) % MOD;}
}

image-20240205205711554


资料获取

大家点赞、收藏、关注、评论啦~

精彩专栏推荐订阅:在下方专栏👇🏻

  • 长路-文章目录汇总(算法、后端Java、前端、运维技术导航):博主所有博客导航索引汇总
  • 开源项目Studio-Vue—校园工作室管理系统(含前后台,SpringBoot+Vue):博主个人独立项目,包含详细部署上线视频,已开源
  • 学习与生活-专栏:可以了解博主的学习历程
  • 算法专栏:算法收录

更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅


整理者:长路 时间:2024.2.5

相关文章:

  • 安卓动态链接库文件体积优化探索实践
  • 大型装备制造企业案例分享——通过CRM系统管理全球业务
  • IEC61499 学习记录
  • 计算机网络——03网络核心
  • 视频融合平台EasyCVR推流成功但平台显示不在线是什么原因?
  • tee漏洞学习-翻译-2:探索 Qualcomm TrustZone的实现
  • 蓝桥杯刷题day07——斐波那契与7
  • 政安晨:示例演绎Python的函数与获取帮助的方法
  • git的奇特知识点
  • 【python】绘制爱心图案
  • mcu短时间内发生多次中断,如何解决中断丢失问题?
  • JAVA原型模式详解
  • 物联网ARM开发-STM32之RTC浅谈
  • MQ,RabbitMQ,SpringAMQP的原理与实操
  • 计算机中的缓存与内存
  • [LeetCode] Wiggle Sort
  • 【Amaple教程】5. 插件
  • 3.7、@ResponseBody 和 @RestController
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • es6--symbol
  • laravel 用artisan创建自己的模板
  • python 学习笔记 - Queue Pipes,进程间通讯
  • 关于Flux,Vuex,Redux的思考
  • 猴子数据域名防封接口降低小说被封的风险
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 警报:线上事故之CountDownLatch的威力
  • 算法之不定期更新(一)(2018-04-12)
  • 为什么要用IPython/Jupyter?
  • 小程序开发中的那些坑
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​MySQL主从复制一致性检测
  • ​Python 3 新特性:类型注解
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #git 撤消对文件的更改
  • #Java第九次作业--输入输出流和文件操作
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (6)STL算法之转换
  • (AngularJS)Angular 控制器之间通信初探
  • (C++)八皇后问题
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (蓝桥杯每日一题)love
  • (离散数学)逻辑连接词
  • (原)本想说脏话,奈何已放下
  • (转)iOS字体
  • (转)Linux下编译安装log4cxx
  • (转)scrum常见工具列表
  • ./configure、make、make install 命令
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .Net Core与存储过程(一)