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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/455128.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库学习笔记2024/2/5

2. SQL 全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了 一套操作关系型数据库统一标准 2.1 SQL通用语法 在学习具体的SQL语句之前&#xff0c;先来了解一下SQL语言的通用语法。 1). SQL语句可以单行或多行书写&…

MySQL学习一、库和表的基础操作

目录 一、常用数据类型 1.数值类型 2.字符串类型 3.日期类型 ​二、数据库的基础操作 三、表的基础操作 一、常用数据类型 1.数值类型 数值类型可以指定为无符号&#xff08;unsigned &#xff09;&#xff0c;但不建议取 2.字符串类型 3.日期类型 二、数据库的基础操作…

CentOS7搭建k8s-v1.28.6集群详情

文章目录 1.灌装集群节点操作系统1.1 设置hosts1.2 设置nameserver1.3 关闭防火墙1.4 关闭Selinux1.5 关闭Swap分区1.6 时间同步1.7 调整内核参数1.8 系统内核升级 2.安装Docker2.1 卸载旧Docker2.2 配置Docker软件源2.3 安装Docker 3.部署Kubernets集群3.1 设置 K8s 软件源3.2…

Node.js JSON Schema Ajv依赖库逐步介绍验证类型和中文错误提示

在构建应用程序时&#xff0c;数据的有效性是至关重要的。为了确保传入的数据符合预期的格式和规范&#xff0c;我们可以使用 Ajv&#xff08;Another JSON Schema Validator&#xff09;进行验证。在这篇博文中&#xff0c;我们将从头开始学习 Ajv&#xff0c;逐步介绍验证类型…

如何在Windows系统上部署docker

上次在Windows系统上部署成功Ubuntu系统&#xff0c;这次准备在Windows上部署docker desktop应用 这个应用软件类似于虚拟机&#xff0c;可以在该应用软件上部署多个镜像容器。其最直观的表现就是可以借用Windows和Ubuntu终端来访问docker“模拟的系统”。 Docker简介 Docke…

OCR升级版 — 微调EasyOCR实战

OCR是从图像中提取文本的有价值工具。然而&#xff0c;有时您使用的OCR在特定需求上的表现不如您所希望的那样好。如果您面临这样的问题&#xff0c;微调OCR引擎是解决的一种方法。在本教程中&#xff0c;我将向您展示如何微调EasyOCR&#xff0c;这是一个免费、开源的OCR引擎&…

Golang-Map有序输出——使用orderedmap库实现

前言 工作中遇到一个问题&#xff1a;需要导出一个MySQL表格&#xff0c;表格内容由sql查询得来。但现在发现&#xff0c;所导出的表格中&#xff0c;各列的顺序不确定。多次导出&#xff0c; 每一次的序列顺序也是不定的。 因此确定是后端&#xff0c;Map使用相关导致的问题。…

安卓动态链接库文件体积优化探索实践

背景介绍 应用安装包的体积影响着用户下载量、安装时长、用户磁盘占用量等多个方面&#xff0c;据Google Play统计&#xff0c;应用体积每增加6MB&#xff0c;安装的转化率将下降1%。 安装包的体积受诸多方面影响&#xff0c;针对dex、资源文件、so文件都有不同的优化策略&…

Python脚本之操作Elasticsearch【一】

本文为博主原创&#xff0c;未经授权&#xff0c;严禁转载及使用。 本文链接&#xff1a;https://blog.csdn.net/zyooooxie/article/details/109588072 前面刚写了 requests发请求 操作Elasticsearch - Search https://blog.csdn.net/zyooooxie/article/details/123730279&…

关于RabbitMQ面试题汇总

什么是消息队列&#xff1f;消息队列有什么用&#xff1f; 消息队列是一种在应用程序之间传递消息的通信机制。它是一种典型的生产者-消费者模型&#xff0c;其中生产者负责生成消息并将其发送到队列中&#xff0c;而消费者则从队列中获取消息并进行处理。消息队列的主要目的是…

束集搜索(Beam search)

在seq2seq任务重&#xff0c;传统的获取decoder输出的结果过程中&#xff0c;在每一个时间步上&#xff0c;我们只选择概率最大的那个词&#xff0c;作为当前时间步的输出&#xff0c;即在每一个时间步上我们取到的都是最大概率的词。等到解码器获取到 <EOS> 词元结束循环…

环境配置:Ubuntu18.04 ROS Melodic安装

前言 不同版本的Ubuntu与ROS存在对应关系。 ROS作为目前最受欢迎的机器人操作系统&#xff0c;其核心代码采用C编写&#xff0c;并以BSD许可发布。ROS起源于2007年&#xff0c;是由斯坦福大学与机器人技术公司Willow Garage合作的Switchyard项目。2012年&#xff0c;ROS团队从…