灌溉机器人 状压dp

灌溉机器人

题目描述

农田灌溉是一项十分费体力的农活,特别是大型的农田。小明想为农民伯伯们减轻农作负担,最近在研究一款高科技——灌溉机器人。它可以在远程电脑控制下,给农田里的作物进行灌溉。

现在有一片 N 行 M 列的农田。农田的土壤有两种类型:类型 H 和类型 P,每一个格子上的土壤类型相同。其中类型 P 的土壤硬度较大,可以用来布置灌溉机器人,但是一个格子上只能布置一台。类型 H 的土壤不能布置灌溉机器人。一台灌溉机器人的灌溉区域如下图所示:

image.png
黄色表示灌溉机器人布置的格子,红色表示其灌溉区域,即四个方向上各外扩展两个格子。

小明想在农田上尽可能多布置一些灌溉机器人,但是任意一台机器人不能在任意一台机器人的灌溉区域里,否则机器容易进水出故障。现在已知农田每个格子的土壤类型,请你来帮小明计算一下,小明最多能布置多少台灌溉机器人。

输入描述

输入第一行输入两个正整数N,M(N≤100,M≤10),表示农田的行和列。

接下来输入 N 行,每行输入连续的 M 个字符(P或者H),中间没有空格。表示农田每个格子上的土壤类型。

输出描述

输出一行,输出一个整数,表示最多能摆放的灌溉机器人的数量。

用例输入 1

3 4
PHPP
PHPP
PHHP

用例输出 1

3

代码

#include <bits/stdc++.h>
using namespace std;
#define max_Heap(x) priority_queue<x, vector<x>, less<x>>
#define min_Heap(x) priority_queue<x, vector<x>, greater<x>>
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<long long, long long> PLL;
const double PI = acos(-1);int n, m;              // n行m列
char field[106][16];   // 记录土壤是否能布置灌溉机器人
vector<int> s[106];    // 存储第i行中所有的合法状态
int dp[106][106][106]; // dp表示遍历到第i行时,第i行状态为序号j,第i-1行状态为序号k时最大能摆放的机器人数量int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);unordered_map<int, int> mp;cin >> n >> m;for (int i = 1; i <= n; i++){for (int j = 0; j < m; j++){cin >> field[i][j]; // 读入土壤类型}}// 预处理存储第i行中所有的合法状态for (int i = 1; i <= n; i++){for (int j = 0; j < (1 << m); j++){bool ok = 1; // 是否合法for (int k = 0; k < m; k++){if (((j >> k) & 1) && (field[i][k] == 'H')) // 如果在H类型土壤上放机器人,则不合法{ok = 0;break;}}if ((j & (j << 1)) || (j & (j << 2)) || (j & (j >> 1)) || (j & (j >> 2))) // 判断左右方向扩展的两个格子是否合法{ok = 0;}if (ok)s[i].push_back(j);}}// 预处理每一行中各种放置状态机器人的个数,并存储在map中for (int i = 0; i < (1 << m); i++){int cnt = 0;for (int j = 0; j < m; j++){if ((i >> j) & 1)cnt++;}mp[i] = cnt;}// 初始化第一行的dpfor (int i = 0; i < s[1].size(); i++){dp[1][i][0] = mp[s[1][i]];}s[0].push_back(0);// 枚举到第i行for (int i = 1; i <= n; i++){// 枚举当前行所有状态for (int num3 = 0; num3 < s[i].size(); num3++){int s3 = s[i][num3];// 枚举上一行所有状态for (int num2 = 0; num2 < s[i - 1].size(); num2++){int s2 = s[i - 1][num2];// 枚举上上一行所有状态for (int num1 = 0; num1 < s[i - 2].size(); num1++){int s1 = s[i - 2][num1];// 如果三行之间的关系合法,则更新dpif (!(s1 & s2) && !(s1 & s3) && !(s2 & s3))dp[i][num3][num2] = max(dp[i][num3][num2], dp[i - 1][num2][num1] + mp[s3]);}}}}int ans = 0;// 遍历找最大值for (int i = 0; i < s[n].size(); i++){for (int j = 0; j < s[n - 1].size(); j++){ans = max(ans, dp[n][i][j]);}}cout << ans;return 0;
}

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

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

相关文章

Java Jackson-jr 库是干什么用的

Jackson-jr 是一个轻量级的Java JSON 处理库。这个库被设计用来替代 Jackson 的复杂性。对比 Jackson 的复杂 API&#xff0c;Jackson-jr 的启动速度更快&#xff0c;包大小更小。 虽然Jackson databind&#xff08;如ObjectMapper&#xff09;是通用数据绑定的良好选择&#…

三维重建(SFM)与实时定位建图(SLAM)的区分与联系

1、SLAM SLAM是Simultaneous Location and Mapping&#xff0c;同时定位与地图构建。是指搭载特定传感器的主体&#xff0c;在没有环境先验信息的情况下&#xff0c;于运动过程中建立环境的模型&#xff0c;同时估计自己的运动。目的是解决自主机器人“定位”和“建图”两个问题…

AI学习指南-学习AI需要的编程基础

亲爱的AI初学者们&#xff0c;欢迎来到人工智能的奇妙世界&#xff01;&#x1f680; 在这篇博客中&#xff0c;我将带你了解学习人工智能所需的编程基础。不用担心&#xff0c;我会尽量用简单易懂的方式来解释&#xff0c;让你即使是编程新手也能轻松上手&#xff01; 1. Pyt…

OpenCV多张图片堆叠显示

OpenCV实现多张图片堆叠显示 程序思路效果代码 程序思路 读取两张或多张图片&#xff1b;获取图片尺寸&#xff1b;选择多张图片中较大的宽度和高度建立画布&#xff1b;合并图片到画布&#xff1b; 效果 代码 import cv2 import numpy as np# 读取两张图片 img1 cv2.imrea…

计算机网络中常用的网络协议

计算机网络中的网络协议可以按照其功能和作用的不同分为多种类型&#xff0c;常见的网络协议包括 传输层协议&#xff1a; TCP (Transmission Control Protocol)&#xff1a;传输控制协议&#xff0c;提供可靠的数据传输服务&#xff0c;保证数据的完整性和顺序性。UDP (User D…

C# Web控件与数据感应之 TreeView 类

目录 关于 TreeView 一些区别 准备数据源 范例运行环境 一些实用方法 获取数据进行呈现 ​根据ID设置节点 获取所有结点的索引 小结 关于 TreeView 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;Web控件与数据源之间的交互&#xff0c;本文将继续介绍与…

mysql设置允许其他IP访问

文章目录 更改mysql配置文件登录mysql 更改mysql配置文件 查找.ini或者.cnf文件 更改bind-address为0.0.0.0 [mysqld] character-set-serverutf8mb4 bind-address0.0.0.0 default-storage-engineINNODB [mysql] default-character-setutf8mb4 [client] default-character-s…

服务器并发编程--libevent

文章目录 一、Libevent概述1.两个重要的结构体2.libevent常用接口 二、libevent IO事件三、libevent信号事件四、libevent高并发服务器参考 一、Libevent概述 Libevent 是一个用C语言编写的、轻量级的开源高性能网络库&#xff0c;主要有以下几个亮点&#xff1a;事件驱动&…

redis集群-主从机连接过程

首先从机需要发送自身携带的replid和offset向主机请求连接 replid&#xff1a;replid是所有主机在启动时会生成的一个固定标识&#xff0c;它表示当前复制流的id&#xff0c;当从机第一次请求连接时&#xff0c;主机会将自己的replid发送给从机&#xff0c;从机在接下来的请求…

LAME及 iOS 编译

文章目录 关于 LAME编译 for iOS 关于 LAME 官网&#xff1a;https://lame.sourceforge.io LAME是根据LGPL许可的高质量MPEG音频层III&#xff08;MP3&#xff09;编码器。 LAME的开发始于1998年年中左右。Mike Cheng 最开始将它作为针对8hz-MP3编码器源的补丁。在其他人提出…

Redis(九)渐进式遍历 | 数据库管理

文章目录 前言什么是渐进式遍历SCAN数据库管理 前言 前面我们学习了针对 redis 五种基本数据类型和五种特殊数据类型的常用命令&#xff0c;其中通用命令 keys pattern 我们都知道是用来查询当前 redis 服务器中有哪些 key 的&#xff0c;而如果此时 redis 服务器中存在很多的…

Pspnet

Pyramid Scene Parsing Network

Linux mount 挂载出现疑难问题;mount can‘t find in /etc/fstab

当挂载出现 “mount cant find in /etc/fstab” 疑难问题时&#xff0c;你需要检查挂载的虚拟文件目录是否已经被创建成功。 或者挂载路径不是一个文件目录&#xff0c;而不是一个文件。 如果是文件你就删除它&#xff0c;并且在重建为目录类型&#xff0c;如果这样都无法解决&…

mac安装虚拟机linux系统

需要下载的有&#xff1a;centos8镜像 , 虚拟器 VMware 软件包 , Termius 或者xshell 1. CentOS系统下载 linux系统一般有&#xff1a; CentOS、ubuntu、redhat&#xff0c;选择一种进行安装就可以 CentOS 2024 年开始停止维护和发布 CentOS8的下载与安装(windows下安装) 镜…

AI工具大揭秘:如何改变我们的工作和生活

文章目录 &#x1f4d1;前言一、常用AI工具&#xff1a;便利与高效的结合1.1 语音助手1.2 智能推荐系统1.3 自然语言处理工具 二、创新AI应用&#xff1a;不断突破与发展2.1 医疗诊断AI2.2 智能家居2.3 无人驾驶技术 三、AI工具在人们生活中的应用和影响3.1 生活方式的变化3.2 …

夏目友人帐所有妖怪名单

夏目友人帐妖怪名单 夏目友人帐 第一季 2008.07.07第1话&#xff1a;猫和友人帐 / 猫と友人帐 菱垣 狞影 斑第2话&#xff1a;露神之祠 / 露神の祠 露神 濯第3话&#xff1a;八原的怪人 / 八ツ原の怪人 一只目 牛头&#xff08;中级妖怪&#xff09;第4话&#xff1a;时雨与少女…

MyBatisPlus @TableLogic实现全局自动逻辑删除

一、背景 有一天&#xff0c;小王在编写代码时实现了一个删除操作&#xff0c;但由于测试场景覆盖不全&#xff0c;上线后不慎删除了系统中的部分业务数据。幸运的是&#xff0c;系统已经开启了binlog日志功能&#xff0c;使得我们能够根据日志来恢复这些误删的数据。这一事故…

TransUNet或SwinUNet报错指南

Transformer与Unet的结合是本人的2024毕设项目&#xff0c;在此之前从未接触过该领域&#xff0c;一切从0开始的过程十分痛苦&#xff0c;希望能帮助到你们 本笔记不定时更新 文章目录 复现报错使用预处理Synapse数据集的通用问题使用预处理ACDC数据集的通用问题找不到require…

https自签名ssl证书生成流程

准备工作&#xff1a; 0.安装完整版的openssl openssl下载官网 安装到C:\OpenSSL32&#xff0c;也可以安装到其它盘&#xff0c;不要包含空格和中文 打开openssl.exe所在目录如:C:\OpenSSL32\bin&#xff0c;输入cmd.exe打开cmd控制台 1.创建ca文件夹 ,证书文件夹 mkdir …

基于Spring Boot的学生在线答疑系统设计与实现

基于Spring Boot的学生在线答疑系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 管理员登录界面 教师登陆界面 问题发布信息界面&am…