LeetCode 2209.用地毯覆盖后的最少白色砖块:记忆化搜索之——深度优先搜索(DFS)

【LetMeFly】2209.用地毯覆盖后的最少白色砖块:记忆化搜索之——深度优先搜索(DFS)

力扣题目链接:https://leetcode.cn/problems/minimum-white-tiles-after-covering-with-carpets/

给你一个下标从 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

解题方法:深度优先搜索(DFS)

写一个函数dfs(n, index),代表使用n块地毯从下标index开始往后覆盖剩余的最小白色砖块数。

  • 如果不覆盖当前砖块:

    dfs(n, index + 1) + (floor[index] == '1')

    1. 可以使用n块地毯覆盖后续砖块,最少有dfs(n, index + 1)块白砖不能覆盖
    2. 如果这块砖是白色,则未覆盖白砖数量加一
  • 如果覆盖当前砖块:

    dfs(n - 1, index + 地毯长度)

    1. 可以使用n - 1块地毯覆盖从index + 地毯长度开始的砖块

终止条件:当前地毯能覆盖剩下所有砖块。

然后,再使用一个缓存记忆化一下就好了。

  • 时间复杂度 O ( n u m C a r p e t s × l e n ( f l o o r ) ) O(numCarpets\times len(floor)) O(numCarpets×len(floor))
  • 空间复杂度 O ( n u m C a r p e t s × l e n ( f l o o r ) ) O(numCarpets\times len(floor)) O(numCarpets×len(floor))

AC代码

C++
/** @Author: LetMeFly* @Date: 2025-02-21 12:25:21* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-02-21 13:05:12*/
class Solution {
private:unordered_map<int, int> cache;string floor;int perLen;int dfs(int n, int startIndex) {int code = n * 1000 + startIndex;if (cache.count(code)) {return cache[code];}if (n * perLen >= floor.size() - startIndex) {return cache[code] = 0;}int ans = dfs(n, startIndex + 1) + (floor[startIndex] == '1');  // 不覆盖if (n) {ans = min(ans, dfs(n - 1, startIndex + perLen));  // 覆盖}return cache[code] = ans;}
public:int minimumWhiteTiles(string& floor, int numCarpets, int carpetLen) {this->floor = move(floor);this->perLen = carpetLen;return dfs(numCarpets, 0);}
};
Python
'''
Author: LetMeFly
Date: 2025-02-21 13:05:56
LastEditors: LetMeFly.xyz
LastEditTime: 2025-02-21 13:11:13
'''
from functools import cacheclass Solution:@cachedef dfs(self, n: int, startIndex: int) -> int:if n * self.perLen >= len(self.floor) - startIndex:return 0ans = self.dfs(n, startIndex + 1) + (self.floor[startIndex] == '1')if n:ans = min(ans, self.dfs(n - 1, startIndex + self.perLen))return ansdef minimumWhiteTiles(self, floor: str, numCarpets: int, carpetLen: int) -> int:self.floor = floorself.perLen = carpetLenreturn self.dfs(numCarpets, 0)
Java
/** @Author: LetMeFly* @Date: 2025-02-21 13:05:59* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-02-21 14:39:29*/
import java.util.Map;
import java.util.HashMap;class Solution {private String floor;private int perLen;private Map<Integer, Integer> cache = new HashMap<>();private int dfs(int n, int index) {int code = n * 1000 + index;if (cache.containsKey(code)) {return cache.get(code);}if (n * perLen >= floor.length() - index) {cache.put(code, 0);return 0;}int ans = dfs(n, index + 1);if (floor.charAt(index) == '1') {ans++;}if (n > 0) {ans = Math.min(ans, dfs(n - 1, index + perLen));}cache.put(code, ans);return ans;}public int minimumWhiteTiles(String floor, int numCarpets, int carpetLen) {this.floor = floor;perLen = carpetLen;return dfs(numCarpets, 0);}
}
Go
/** @Author: LetMeFly* @Date: 2025-02-21 13:06:05* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-02-21 14:21:55*/
package mainfunc dfs_MWTACWC(n, startIndex int, floor string, perLen int, cache map[int]int) (ans int) {code := n * 1000 + startIndexans, ok := cache[code]if ok {return}if n * perLen >= len(floor) - startIndex {cache[code] = 0return 0}ans = dfs_MWTACWC(n, startIndex + 1, floor, perLen, cache)if floor[startIndex] == '1' {ans++}if n > 0 {ans = min(ans, dfs_MWTACWC(n - 1, startIndex + perLen, floor, perLen, cache))}cache[code] = ansreturn
}func minimumWhiteTiles(floor string, numCarpets int, carpetLen int) int {return dfs_MWTACWC(numCarpets, 0, floor, carpetLen, map[int]int{})
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

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

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

相关文章

「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件

PDF Reader 轻松查看、编辑、批注、转换、数字签名和管理 PDF 文件&#xff0c;以提高工作效率并充分利用 PDF 文档。 像专业人士一样编辑 PDF 编辑 PDF 文本 轻松添加、删除或修改 PDF 文档中的原始文本以更正错误。自定义文本属性&#xff0c;如颜色、字体大小、样式和粗细。…

【报错解决】vue打开界面报错Uncaught SecurityError: Failed to construct ‘WebSocket‘

问题描述&#xff1a; vue运行时正常&#xff0c;但是打开页面后报错 Uncaught SecurityError: Failed to construct WebSocket: An insecure WebSocket connection may not be initiated from a page loaded over HTTPS. 解决方案&#xff1a; 在项目列表中的public下的ind…

骶骨神经

骶骨肿瘤手术后遗症是什么_39健康网_癌症 [健康之路]匠心仁术&#xff08;七&#xff09; 勇闯禁区 骶骨肿瘤切除术

wps中的js开发

严格区分大小写 /*** learn_js Macro*/ function test() {Range(D7).Value2Selection.Value2; // Selection.formula "100" }function Workbook_SheetSelectionChange(Sh, Target) {if(Sh.Name Sheet1) {test();}}function test2() {// 把I4单元格及其周边有数的单…

书生大模型实战营12-InternVL 多模态模型部署微调

文章目录 L2——进阶岛InternVL 部署微调实践0.开发机创建与使用1.环境配置1.1.训练环境配置1.2.推理环境配置 2.LMDeploy部署2.1.LMDeploy基本用法介绍2.2.网页应用部署体验2.3 出错解决2.3.1 问题12.3.2 问题2 3.XTuner微调实践3.1.准备基本配置文件3.2.配置文件参数解读3.3.…

深度学习之图像回归(二)

前言 这篇文章主要是在图像回归&#xff08;一&#xff09;的基础上对该项目进行的优化。&#xff08;一&#xff09;主要是帮助迅速入门 理清一个深度学习项目的逻辑 这篇文章则主要注重在此基础上对于数据预处理和模型训练进行优化前者会通过涉及PCA主成分分析 特征选择 后…

安科瑞能源物联网平台助力企业实现绿色低碳转型

安科瑞顾强 随着全球能源结构的转型和“双碳”目标的推进&#xff0c;能源管理正朝着智能化、数字化的方向快速发展。安科瑞电气股份有限公司推出的微电网智慧能源管理平台&#xff08;EMS 3.0&#xff09;&#xff0c;正是这一趋势下的创新解决方案。该平台集成了物联网&…

基于Spring Boot的农产品智慧物流系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

论文笔记-WSDM2024-LLMRec

论文笔记-WSDM2024-LLMRec: Large Language Models with Graph Augmentation for Recommendation LLMRec: 基于图增强的大模型推荐摘要1.引言2.前言2.1使用图嵌入推荐2.2使用辅助信息推荐2.3使用数据增强推荐 3.方法3.1LLM作为隐式反馈增强器3.2基于LLM的辅助信息增强3.2.1用户…

优化YOLOv8:如何利用ODConv卷积解决复杂背景下的目标识别问题

文章目录 1. YOLOv8的现状与挑战1.1 ODConv的提出背景1.2 ODConv卷积的原理 2. YOLOv8与ODConv的结合2.1 ODConv集成到YOLOv8中的架构2.2 代码实现示例2.3 性能评估与改进 3. ODConv的实际应用与优化3.1 ODConv在不同数据集上的表现3.1.1 COCO数据集3.1.2 VOC数据集3.1.3 自定义…

DPVS-2:单臂负载均衡测试

上一篇编译安装了DPVS&#xff0c;这一篇开启DPVS的负载均衡测试 &#xff1a; 单臂 FULL NAT模式 拓扑-单臂 单臂模式 DPVS 单独物理机 CLINET&#xff0c;和两个RS都是另一个物理机的虚拟机&#xff0c;它们网卡都绑定在一个桥上br0 &#xff0c; 二层互通。 启动DPVS …

Maven导入hutool依赖报错-java: 无法访问cn.hutool.core.io.IORuntimeException 解决办法

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、报错二、解决办法 一、报错 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-captcha</artifactId> </de…

flowable适配达梦数据库

文章目录 适配相关问题无法从数据库产品名称“DM DBMS”中推断数据库类型分析解决 构建ibatis SqlSessionFactory时出错&#xff1a;inStream参数为null分析解决 liquibase相关问题问题一&#xff1a;不支持的数据库 Error executing SQL call current_schema: 无法解析的成员访…

ElasticSearch公共方法封装

业务场景 1、RestClientBuilder初始化&#xff08;同时支持单机与集群&#xff09; 2、发送ES查询请求公共方法封装&#xff08;支持sql、kql、代理访问、集群访问、鉴权支持&#xff09; 3、判断ES索引是否存在&#xff08;/_cat/indices/${indexName}&#xff09; 4、判断ES…

题海拾贝:【枚举】P2010 [NOIP 2016 普及组] 回文日期

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

《深入理解JVM》实战笔记(二): 类加载机制与类加载器

序言 Java 语言的强大之处之一在于其动态加载的能力&#xff0c;使得 Java 程序可以在运行时加载新的类&#xff0c;而不需要在编译时确定所有的类信息。这一切都离不开 JVM 的类加载机制。本篇博客将详细探讨 JVM 的类加载过程以及类加载器的工作原理&#xff0c;帮助你更深入…

vin码拍照识别-车牌识别api-vin码接口解析

在当今数字化飞速发展的背景下&#xff0c;如何高效、准确地管理和追踪车辆信息成为了众多企业和个人关注的焦点。VIN码&#xff08;Vehicle Identification Number&#xff09;和车牌作为车辆独一无二的身份标识&#xff0c;在车辆管理、保险理赔、二手车交易等多个场景中发挥…

Tomcat理论(Ⅰ)

目录 服务器流程图一览 一、JavaWeb前奏(了解) 1. C/S结构 2. B/S结构 3. 静态网页&动态网页 4.常见的网页 5.Web服务器 知名服务器&#xff1a; ​编辑 二、Tomcat安装&#xff08;熟练&#xff09; 1.Tomcat概述 2.Tomcat的作用 3.Tomcat安装 4.Tomcat测试 3.…

[实现Rpc] 通信-Muduo库的实现 | 完美转发 | reserve | unique_lock

目录 MudouBuffer ⭕右值引用 | 完美转发 右值引用 完美转发 实现原理 结合右值引用和完美转发的例子 LVProtocol ⭕vector 的 reserve 函数 1. 背景 2. reserve 函数原型 3. 示例代码 4. 输出结果 5. 结果解析 6. 关键点说明 MuduoConnection ⭕mudou 库 &am…

[OD E 100] 生成哈夫曼树

题目 题目描述 给定长度为 n 的无序的数字数组&#xff0c;每个数字代表二叉树的叶子节点的权值&#xff0c;数字数组的值均大于等于 1 。请完成一个函数&#xff0c;根据输入的数字数组&#xff0c;生成哈夫曼树&#xff0c;并将哈夫曼树按照中序遍历输出。 为了保证输出的二…