SMOJ 一笔画/洛谷 P7171 COCI 2020/2021 #3 Selotejp 题解
1.一笔画
题意
给出 n 行 m 列的点阵,每个点是一个字符: “.” 或 “#” ,其中“#”表示该点是障碍物。
现在小毛的问题是: 他最少要画多少笔才能把点阵里所有的“.”都覆盖完毕(被小毛画到的点就会被覆盖)。
小毛每次只能在某一行或某一列画,小毛当然想一笔就把某一行或某一列画完,
但很遗憾,在任何时候都不允许小毛画的那一段点阵含有障碍物。
还有一点更奇怪: 已经被画过的点,不能重复被画。
问小毛最少要画多少笔?
0 < n , m ≤ 15 0 < n, m \le15 0<n,m≤15
2.Selotejp
两个字符的含义交换,数据范围改成 1 ≤ n ≤ 1000 , 1 ≤ m ≤ 10 1≤n≤1000,1≤m≤10 1≤n≤1000,1≤m≤10
思路
非常复杂的一道题。
我们发现 n , m n,m n,m中有一个尤其小,那么可以想到对每一行的状态压缩
我们钦定 m m m位状态 s s s,每一位上, 0 0 0 表示填横线或者有障碍物, 1 1 1表示填竖线。如果到了右侧边界,直接转移到下一行第一个,继承这个行状态,表示该行 r r r对下一行 r + 1 r+1 r+1的影响。
考虑一行一行处理,对于 r r r行 c c c列的格子,分情况考虑怎么画这个格子。
先明确:下文讲提到本位 c c c和上一位(左边) c − 1 c-1 c−1,在代码中它们的状态表示为:
int t=(1<<(c-1)),pt=(1<<(c-1-1));//t本位 pt上一位
障碍物
如果这个格子是一个障碍物,那么状态 s s s上的这一位理应填 0 0 0,需要强制把它修改为 0 0 0,因为不会从这个障碍物伸出一条竖线影响下一行了。之后向下一位转移。
if(a[r][c]=='#')//障碍物
{if((s&t)==t)f[r][c][s]=dfs(r,c+1,s^t);//去1 else f[r][c][s]=dfs(r,c+1,s);return f[r][c][s];
}
填竖线
如果上一行继承下来的状态,该为 c c c为 1 1 1,那么可以直接利用这条现成的竖线;否则需要多加一条竖线,把该位强制修改为 1 1 1,并记得加上 1 1 1。
if((s&t)==t)shu=dfs(r,c+1,s);//s的c位是1,利用现有的竖线
else shu=dfs(r,c+1,s|t)+1;//新建一条竖线
填横线
如果左边 c − 1 c-1 c−1位不是障碍物,且上一位 c − 1 c-1 c−1位填了 0 0 0,说明 c c c位左边有一条现成的横线,可以直接利用,并将该位 c c c强制修改为 0 0 0。
否则就需要在这一位新开一条横线,并将该位 c c c强制修改为 0 0 0。
if(a[r][c-1]=='.'&&!((s&pt)==pt))//上一个不是障碍物,且上一个填了横线
{if((s&t)==t)heng=dfs(r,c+1,s^t);//原本是竖线 else heng=dfs(r,c+1,s);//本来就是横线
}
else //上一个是障碍物,要新建一条横线
{if((s&t)==t)heng=dfs(r,c+1,s^t)+1;else heng=dfs(r,c+1,s)+1;
}
换行、继承等操作,本人使用记忆化搜索。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=16,M=16,inf=0x3f3f3f3f;
int n,m;
char a[N][M];
int f[N][M][1<<M];
int dfs(int r,int c,int s)
{if(r>n)return 0;if(c>m)return dfs(r+1,1,s);//换行,把状态复制到下一行 if(!(f[r][c][s]>=inf))return f[r][c][s];int t=(1<<(c-1)),pt=(1<<(c-1-1));//t本位 pt上一位 if(a[r][c]=='#')//障碍物 {if((s&t)==t)f[r][c][s]=dfs(r,c+1,s^t);//去1 else f[r][c][s]=dfs(r,c+1,s);return f[r][c][s];}//竖 int heng=inf,shu=inf;if((s&t)==t)shu=dfs(r,c+1,s);//s的c位是1,利用现有的竖线 else shu=dfs(r,c+1,s|t)+1;//新建一条竖线 if(a[r][c-1]=='.'&&!((s&pt)==pt))//上一个不是障碍物,且上一个填了横线 {if((s&t)==t)heng=dfs(r,c+1,s^t);//原本是竖线 else heng=dfs(r,c+1,s);//本来就是横线 }else //上一个是障碍物,要新建一条横线 {if((s&t)==t)heng=dfs(r,c+1,s^t)+1;else heng=dfs(r,c+1,s)+1;}f[r][c][s]=min(heng,shu);return f[r][c][s];
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];memset(f,inf,sizeof(f));printf("%d",dfs(1,1,0));return 0;
}
第 2 2 2题的代码敬请自行修改
相关文章:
SMOJ 一笔画/洛谷 P7171 COCI 2020/2021 #3 Selotejp 题解
1.一笔画 题意 给出 n 行 m 列的点阵,每个点是一个字符: “.” 或 “#” ,其中“#”表示该点是障碍物。 现在小毛的问题是: 他最少要画多少笔才能把点阵里所有的“.”都覆盖完毕(被小毛画到的点就会被覆盖ÿ…...

【Java学习】继承
一、继承 子类继承父类,子类这个类变量的引用在原有的指向子类自己类变量空间的原有访问权限上,增加上了父类类变量空间的访问权限,此时子类类变量指向的空间变为了原来子类类变量空间加上父类类变量空间,此时子类类变量空间就变成…...

计时器任务实现(保存视频和图像)
下面是一个简单的计时器任务实现,可持续地每秒保存一幅图像,也可持续地每60秒保存一个视频,图像和视频均以当前时间命名: TimerTask类的实现如下: class TimerTask { public:TimerTask(const std::string& path):…...

树莓百度百科能否揭开成都树莓集团的神秘面纱?
树莓百度百科作为大众获取信息的重要渠道,在一定程度上为人们了解树莓集团提供了窗口,但要完全揭开其神秘面纱,仍存在一定局限性。 从树莓百度百科上,我们能获取到关于树莓集团的基本信息,如公司的成立时间、法定代表人…...

【如何看懂数据手册和原理图】
【如何看懂数据手册和原理图】 文章目录 【如何看懂数据手册和原理图】1.数据手册1.1去哪里看?1.2需要注意的 2.支路3.回路4.网孔5.电路定理:基尔霍夫定律**集总参数电路** 抽象理想化5.1基尔霍夫电流定律 (KCL)5.2基尔霍夫电压定律 (KVL)5.3总结 6.读懂…...

SQL 优化工具使用之 explain 详解
一、导读 对于大部分开发人员来说,平常接触的无非就是增删改查这些基本操作,创建存储过程,视图等等都是 DBA 该干的活,但是想要把这些基本操作写的近乎完美也是一件难事。 而 explain 显示了 MySQL 如何使用索引来处理 select 语…...
深度解析Unity3D渲染管线:网格、材质与GPU渲染的协同逻辑
在3D实时渲染领域,网格(Mesh)、材质(Material)和GPU渲染三者构成了虚拟世界的基石。它们如同乐高积木的零件,通过精确的协作,最终在屏幕上呈现出复杂的视觉场景。本文将从技术原理、协作机制到性…...

POI优化Excel录入
57000单词原始录入时间258S 核心代码: List<Word> wordBookList ExcelUtil.getReader(file.getInputStream()).readAll(Word.class);if (!CollectionUtil.isEmpty(wordBookList)) {for (Word word : wordBookList) {//逐条向数据库中插入单词wordMapper.insert(word);}…...

实时图像与视频超分辨率:高效子像素卷积网络(ESPCN)解析
文章目录 概要理论知识操作实操环境配置基础命令格式:效果示例 概要 超分辨率系列论文阅读卷1:Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network PDF网址:https://arxiv.org/…...

QT--对话框的切换
文章目录 前言一、主窗口ui二、创建子窗口三、步骤1.主界面------>子页面2.子界面------>主页面 四、总结 前言 之前我们学了qt中最重要的东西–信号和槽 我们现在实现这样一个demo,程序启动后弹出主界面,点击主界面的按钮弹出子窗口,…...
深入浅出:CUDA是什么,如何利用它进行高效并行计算
在当今这个数据驱动的时代,计算能力的需求日益增加,特别是在深度学习、科学计算和图像处理等领域。为了满足这些需求,NVIDIA推出了CUDA(Compute Unified Device Architecture),这是一种并行计算平台和编程模…...

Zotero PDF Translate插件配置百度翻译api
Zotero PDF Translate插件可以使用几种翻译api,虽然谷歌最好用,但是由于众所周知的原因,不稳定。而cnki有字数限制,有道有时也不行。其他的翻译需要申请密钥。本文以百度为例,进行申请 官方有申请教程: Zot…...

利用acme.sh 申请 Google 免费证书
1.Google API权限准备 获取 EAB 密钥 ID 和 HMAC 登录你的 GCP 控制台面板,进入 Public Certificate Authority API 管理页面(https://console.cloud.google.com/apis/library/publicca.googleapis.com)点击启动: 或者直接在下一…...

腾讯云cloudstudio使用笔记(一)
0、计划及目标 1)、这个系列用于将cloudstudio快速入门将前端代码在cloudstudio中从git仓库拉下来并运行—本文档的目标已实现 2)、基于cloudstudio和腾讯的ai代码助手腾讯自己满血的deepseek写代码,减少前端工作量—待补充 3)、…...

python自动化制作常规的日报数据可视化
python自动化制作常规的日报数据可视化 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏Ǵ…...

C语言:在主函数中输入十个等长的字符串。用另一函数对它们排序,然后在主函数输出这10个已排好序的字符串。
(1)用字符型二维数组 #include <stdio.h> #include <string.h> int main() {void sort(char s[][6]);int i;char str[10][6];printf("input 10 strings:\n");for (i0;i<10;i)scanf("%s",str[i]);sort(str);printf(&…...

构建高效智能对话前端:基于Ant Design X 的deepseek对话应用
文章目录 实现的效果前言Ant Design X添加欢迎组件创建对话气泡存储对话历史渲染对话气泡 输入组件WebSocket 连接总结 实现的效果 待机页面: 等待页面: 完成页面: 前言 随着人工智能技术的飞速发展,大模型对话系统已成为…...

SQLMesh 系列教程5- 详解SQL模型
本文将详细介绍 SQLMesh 的 SQL 模型组成要素及其在实际项目中的应用。SQLMesh 是一个强大的数据工程工具,其 SQL 模型由 MODEL DDL、预处理语句、主查询、后处理语句以及可选的 ON VIRTUAL UPDATE 语句组成。我们将通过一个电商平台每日销售报告的实例,…...
本地DeepSeek模型GGUF文件转换为PyTorch格式
接前文,我们在本地Windows系统上,基于GGUF文件部署了DeepSeek模型(DeepSeek-R1-Distill-Qwen-1.5B.gguf版本),但是GGUF是已经量化的版本,我们除了对其进行微调之外,无法对其训练,那么还有没有其他办法对本地的GGUF部署的DeepSeek模型进行训练呢?今天我们就反其道而行之…...
Flutter:动态表单(在不确定字段的情况下,生成动态表单)
关于数据模型:模型就是一种规范约束,便于维护管理,在不确定表单内会出现什么数据时,就没有模型一说。 这时就要用到动态表单(根据接口返回的字段,生成动态表单) 1、观察数据格式,定义…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...