力扣LeetCode: 2209 用地毯覆盖后的最少白色砖块

题目:

给你一个下标从 0 开始的 二进制 字符串 floor ,它表示地板上砖块的颜色。

  • floor[i] = '0' 表示地板上第 i 块砖块的颜色是 黑色 。
  • floor[i] = '1' 表示地板上第 i 块砖块的颜色是 白色 。

同时给你 numCarpets 和 carpetLen 。你有 numCarpets 条 黑色 的地毯,每一条 黑色 的地毯长度都为 carpetLen 块砖块。请你使用这些地毯去覆盖砖块,使得未被覆盖的剩余 白色 砖块的数目 最小 。地毯相互之间可以覆盖。

请你返回没被覆盖的白色砖块的 最少 数目。

示例 1:

输入:floor = "10110101", numCarpets = 2, carpetLen = 2
输出:2
解释:
上图展示了剩余 2 块白色砖块的方案。
没有其他方案可以使未被覆盖的白色砖块少于 2 块。

示例 2:

输入:floor = "11111", numCarpets = 2, carpetLen = 3
输出:0
解释:
上图展示了所有白色砖块都被覆盖的一种方案。
注意,地毯相互之间可以覆盖。

提示:

  • 1 <= carpetLen <= floor.length <= 1000
  • floor[i] 要么是 '0' ,要么是 '1' 。
  • 1 <= numCarpets <= 1000

解法:动态规划

问题分析

我们有一个二进制字符串 floor,表示地板上砖块的颜色:

  • floor[i] = '0' 表示第 i 块砖是黑色。

  • floor[i] = '1' 表示第 i 块砖是白色。

我们有 numCarpets 条黑色地毯,每条地毯的长度为 carpetLen。我们的目标是用这些地毯覆盖尽可能多的白色砖块,使得未被覆盖的白色砖块数量最小。


动态规划思路

动态规划的核心思想是将问题分解为子问题,并通过状态转移方程逐步求解。我们需要定义一个状态,表示在某个位置使用一定数量的地毯时,未被覆盖的白色砖块的最小数量。

1. 定义状态

我们定义 dp[i][j] 表示:

  • 覆盖前 i 块砖块(即 floor[0..i-1])。

  • 使用 j 条地毯。

  • 未被覆盖的白色砖块的最小数量。

2. 状态转移方程

对于每一块砖块 i,我们有两种选择:

  1. 不使用地毯覆盖这块砖块

    • 如果这块砖是白色(floor[i-1] == '1'),则未被覆盖的白色砖块数量增加 1。

    • 状态转移:dp[i][j] = dp[i-1][j] + (floor[i-1] == '1' ? 1 : 0)

  2. 使用地毯覆盖这块砖块

    • 如果使用一条地毯覆盖从第 i-carpetLen 到第 i-1 块砖块,那么未被覆盖的白色砖块数量为 dp[i-carpetLen][j-1]

    • 状态转移:dp[i][j] = dp[i-carpetLen][j-1]

我们需要在这两种选择中取最小值:

dp[i][j] = min(dp[i-1][j] + (floor[i-1] == '1' ? 1 : 0),  // 不使用地毯dp[i-carpetLen][j-1]                       // 使用地毯
);
3. 初始化
  • 当没有砖块时i = 0):

    • 无论有多少地毯,未被覆盖的白色砖块数量都是 0。

    • dp[0][j] = 0,其中 0 <= j <= numCarpets

  • 当没有地毯时j = 0):

    • 未被覆盖的白色砖块数量就是前 i 块砖中白色砖块的总数。

    • dp[i][0] = dp[i-1][0] + (floor[i-1] == '1' ? 1 : 0)

4. 最终结果

我们需要计算 dp[n][numCarpets],其中 n 是砖块的总数。这表示覆盖所有砖块并使用所有地毯后,未被覆盖的白色砖块的最小数量。


代码实现

以下是完整的代码实现:

class Solution {
public:int minimumWhiteTiles(string floor, int numCarpets, int carpetLen) {int n = floor.length();// DP 表:dp[i][j] 表示前 i 块砖,使用 j 条地毯时,未被覆盖的白色砖块的最小数量vector<vector<int>> dp(n + 1, vector<int>(numCarpets + 1, 0));// 初始化:当没有地毯时,未被覆盖的白色砖块数量for (int i = 1; i <= n; ++i) {dp[i][0] = dp[i-1][0] + (floor[i-1] == '1' ? 1 : 0);}// 填充 DP 表for (int i = 1; i <= n; ++i) {for (int j = 1; j <= numCarpets; ++j) {// 选择 1:不使用地毯覆盖第 i 块砖int option1 = dp[i-1][j] + (floor[i-1] == '1' ? 1 : 0);// 选择 2:使用地毯覆盖第 i 块砖int option2 = (i >= carpetLen) ? dp[i-carpetLen][j-1] : 0;// 取最小值dp[i][j] = min(option1, option2);}}// 返回结果return dp[n][numCarpets];}
};

示例解释

示例 1:

输入:floor = "10110101"numCarpets = 2carpetLen = 2

  1. 初始化

    • dp[i][0] 表示不使用地毯时,前 i 块砖中白色砖块的数量。

    • 例如,dp[8][0] = 5(因为有 5 块白色砖块)。

  2. 填充 DP 表

    • 对于每块砖,尝试使用或不使用地毯,选择最优解。

    • 最终 dp[8][2] = 2,表示使用 2 条地毯后,未被覆盖的白色砖块数量为 2。

示例 2:

输入:floor = "11111"numCarpets = 2carpetLen = 3

  1. 初始化

    • dp[i][0] 表示不使用地毯时,前 i 块砖中白色砖块的数量。

    • 例如,dp[5][0] = 5(因为有 5 块白色砖块)。

  2. 填充 DP 表

    • 使用 2 条长度为 3 的地毯,可以覆盖所有白色砖块。

    • 最终 dp[5][2] = 0,表示所有白色砖块都被覆盖。


复杂度分析

  • 时间复杂度O(n * numCarpets),其中 n 是砖块的数量。

  • 空间复杂度O(n * numCarpets),用于存储 DP 表。


总结

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

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

相关文章

RabbitMQ 消息队列

1. 消息队列是什么&#xff1f; 当用户注册成功后&#xff0c;就发送邮件。当邮件发送成功了&#xff0c;接口才会提示注册成功信息。但由于发送邮件&#xff0c;依赖于其他厂商的服务&#xff0c;有可能他们的接口会非常耗时。那么用户就一直要等着邮件发送成功了&#xff0c;…

【SQL实验】触发器

下载素材文件”tsgl”、“成绩管理”,将tsgl.bak和成绩管理.bak数据库还原到库中【导入操作在之前的文章中详细讲过】 触发器 1、为图书表设置更新触发器&#xff0c;根据总编号来更新书名、作者、出版社、分类号和单价(根据总编号找到相应记录&#xff0c;然后更新书名、作者…

Win10系统Docker+DeepSeek+ragflow搭建本地知识库

文章目录 1、安装ollama1.1 下载1.2 安装1.3 cmd命令行测试安装成功1.4 拉取模型2、安装ragflow2.1 下载项目2.2 通过docker拉取镜像安装2.3 查看docker日志是否安装成功3、模型配置3.1 第一次登录需要注册3.2 模型添加4、知识库配置4.1 创建知识库4.2 上传文档4.3 解析5、聊天…

redis的应用,缓存,分布式锁

1.应用 1.1可以用作缓存 作用&#xff1a;提交数据的查询效率&#xff0c;减少对数据库的访问频率 什么数据适合放入缓存 1.查询频率高&#xff0c;修改频率低 2.对安全系数比较低 如何实现 Service public class DeptServer {Autowiredprivate DeptMapper deptMapper;Auto…

springboot整合 xxl-job

文章目录 一、xxl-job是什么二、使用步骤 1. 下载并运行管理端代码2. 访问管理页面&#xff0c;确认是否启动成功3. 配置执行器【在自己的springboot项目中配置】4. 在页面上创建执行器和任务&#xff0c;与项目中绑定 总结参考 一、xxl-job是什么 XXL-JOB 是一个分布式任务调…

Jenkins 环境搭建---基于 Docker

前期准备 提前安装jdk、maven、nodeJs&#xff08;如果需要的话&#xff09; 创建 jenkins 环境目录&#xff0c;用来当做挂载卷 /data/jenkins/ 一&#xff1a;拉取 Jenkins 镜像 docker pull jenkins/jenkins:lts 二&#xff1a;设置 Jenkins挂载目录 mkdir -p ~/jen…

小米路由器 AX3000T 降级后无法正常使用,解决办法

问题描述 买了个 AX3000T 路由器&#xff0c;想安装 OpenWRT 或者 安装 Clash 使用&#xff0c;看教程说是需要降级到 v1.0.47 版本。 结果刷机之后路由器无法打开了&#xff0c;一直黄灯亮&#xff0c;中间灭一下&#xff0c;又是黄灯长亮&#xff0c;没有 WIFI 没有连接。以…

金融学-金融机构

前言 金融机构在金融体系运行体系运营中起着不可获缺的关键作用.如规则的制定与监管-中央银行,体系的运营证券公司,体系的供贷的参与者金融中介.本章将用一种说明我们的金融体系是怎样改进经济效率的经济分析,来讲述相关金融机构 金融结构的经济学分析 世界各国的金融体系在…

公网远程家里局域网电脑过程详细记录,包含设置路由器。

由于从校内迁居小区,校内需要远程控制访问小区内个人电脑,于是早些时间刚好自己是电信宽带,可以申请公网ipv4不需要花钱,所以就打电话直接申请即可,申请成功后访问光猫设备管理界面192.168.1.1,输入用户名密码登录超管(密码是网上查下就有了)设置了光猫为桥接模式,然后…

002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡

前文地址&#xff1a; 001 SpringCloudAlibaba整合 - Nacos注册配置中心、Sentinel流控、Zipkin链路追踪、Admin监控 文章目录 8.Feign远程调用、loadbalancer负载均衡整合1.OpenFeign整合1.引入依赖2.启动类添加EnableFeignClients注解3.yml配置4.日志配置5.远程调用测试6.服务…

基于javaweb的SpringBoot校园二手商品系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

国产开源PDF解析工具MinerU

前言 PDF的数据解析是一件较困难的事情&#xff0c;几乎所有商家都把PDF转WORD功能做成付费产品。 PDF是基于PostScript子集渲染的&#xff0c;PostScript是一门图灵完备的语言。而WORD需要的渲染&#xff0c;本质上是PDF能力的子集。大模型领域&#xff0c;我们的目标文件格…

stm32单片机个人学习笔记16(SPI通信协议)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

Springboot + Ollama + IDEA + DeepSeek 搭建本地deepseek简单调用示例

1. 版本说明 springboot 版本 3.3.8 Java 版本 17 spring-ai 版本 1.0.0-M5 deepseek 模型 deepseek-r1:7b 需要注意一下Ollama的使用版本&#xff1a; 2. springboot项目搭建 可以集成在自己的项目里&#xff0c;也可以到 spring.io 生成一个项目 生成的话&#xff0c;如下…

Ubuntu 的RabbitMQ安装

目录 1.安装Erlang 查看erlang版本 退出命令 2. 安装 RabbitMQ 3.确认安装结果 4.安装RabbitMQ管理界面 5.启动服务并访问 1.启动服务 2.查看服务状态 3.通过IP:port 访问界面 4.添加管理员用户 a&#xff09;添加用户名&#xff1a;admin&#xff0c;密码&#xff1…

Powershell Install deepseek

前言 deepseekAI助手。它具有聊天机器人功能&#xff0c;可以与用户进行自然语言交互&#xff0c;回答问题、提供建议和帮助解决问题。DeepSeek 的特点包括&#xff1a; 强大的语言理解能力&#xff1a;能够理解和生成自然语言&#xff0c;与用户进行流畅的对话。多领域知识&…

VS Code 如何搭建C/C++开发环境

目录 1.VS Code是什么 2. VS Code的下载和安装 2.1 下载和安装 2.2.1 下载 2.2.2 安装 2.2 环境的介绍 2.3 安装中文插件 3. VS Code配置C/C开发环境 3.1 下载和配置MinGW-w64编译器套件 3.1.1 下载 3.1.2 配置 3.2 安装C/C插件 3.3 重启VSCode 4. 在VSCode上编写…

vue从入门到精通(十一):条件渲染

条件渲染 1.v-if 写法: (1).v-if“表达式” (2).v-else-if“表达式” (3).v-else“表达式” 适用于:切换频率较低的场景。 特点:不展示的DOM元素直接被移除。 注意:v-if可以和:v-else-if、v-else一起使用&#xff0c;但要求结构不能被“打断” 2.v-show 写法:v-show“…

Java之——“String类”(内容较多,结合目录察看分类)

前言 在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可以使用标准库提供的字符串系列函数完成大部分操作&#xff0c;但是这种将数据和操作数据方法分离开的方式不符合面向对象的思想&#xff0c;而字符串应用又…

【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道

文章目录 从结构到操作&#xff1a;手撕AVL树的实现一、AVL树介绍1.1 什么是AVL树1.2 平衡因子的定义1.3 平衡的意义1.4 AVL树的操作 二、AVL树的节点结构2.1 节点结构的定义&#xff1a; 三、插入操作3.1 插入操作概述3.2 步骤1&#xff1a;按二叉查找树规则插入节点3.3 步骤2…