1.5状态压缩DP

1.小国王

n × n n×n n×n的棋盘上放 k k k个国王,国王可攻击相邻的 8 8 8个格子,求使它们无法互相攻击的方案总数。

输入格式
共一行,包含两个整数 n n n k k k

输出格式
共一行,表示方案总数,若不能够放置则输出 0 0 0

数据范围
1 ≤ n ≤ 10 , 1≤n≤10, 1n10,
0 ≤ k ≤ n 2 0≤k≤n^{2} 0kn2
输入样例:

3 2

输出样例:

16
1.1题解

在这里插入图片描述

在这里插入图片描述
因此这会导致,两斜对角国王相互攻击。

综上所述,我们得到集合转移的约束条件。

下面是代码部分,有很详细的解说
在这里插入图片描述

1.2代码实现
#include<bits/stdc++.h>using namespace std;typedef long long LL;const int N = 12, M = 1 << 10, K = 110;int n,m;
int cnt[M]; //记录该状态中 1 的个数,即该状态所能摆放的国王个数
LL f[N][K][M]; //前 i 行已经摆好,且已摆放好 j 个国王,第 i 行状态是 a 的方案
vector<int> state; //合法的状态
vector<int> head[M]; //该状态能够转移的状态//判断该状态是否有相邻的 1,若没有则合法
bool check(int state)
{return !(state&state>>1);
}//统计该状态中 1 的个数
int count(int state)
{int res=0;for(int i=0;i<n;i++) res+=state>>i&1;return res;
}int main()
{cin>>n>>m;//筛选出合法的状态for(int i=0;i<1<<n;i++)if(check(i)){state.push_back(i);cnt[i]=count(i); //记录该状态中 1 的个数}//枚举出该状态所能转移到的状态for(int i=0;i<state.size();i++)for(int j=0;j<state.size();j++){int a=state[i],b=state[j];if(!(a&b)&&check(a|b)) //能够转移的条件head[a].push_back(b); //状态 a 和状态 b 之间可互相转移}f[0][0][0]=1;for(int i=1;i<=n+1;i++)for(int j=0;j<=m;j++)for(auto a : state) //枚举第 i 行的状态for(auto b : head[a]) //枚举第 i - 1 行的状态if(j>=cnt[a]) f[i][j][a]+=f[i-1][j-cnt[a]][b]; //状态 a 可由状态 b 转移过来// LL res=0;// for(auto x : state) res+=f[n][m][x];// cout<<res<<endl;// 上述代码等价于f[n+1][m][0]cout<<f[n+1][m][0]<<endl;return 0;
}

2.玉米田

农夫约翰的土地由 M × N M×N M×N个小方格组成,现在他要在土地里种植玉米。

非常遗憾,部分土地是不育的,无法种植。

而且,相邻的土地不能同时种植玉米,也就是说种植玉米的所有方格之间都不会有公共边缘。

现在给定土地的大小,请你求出共有多少种种植方法。

土地上什么都不种也算一种方法。

输入格式

1 1 1行包含两个整数 M M M N N N

2.. M + 1 2..M+1 2..M+1行:每行包含 N N N个整数 0 0 0 1 1 1,用来描述整个土地的状况, 1 1 1表示该块土地肥沃,0表示该块土地不育。

输出格式

输出总种植方法对 1 0 8 10^{8} 108取模后的值。

数据范围
1 ≤ M , N ≤ 12 1≤M,N≤12 1M,N12

输入样例:

2 3
1 1 1
0 1 0

输出样例:

9
2.1题解

在这里插入图片描述
算法构造
经典的棋盘型状态压缩动态规划,我们可以按照之前Acwing上P1064小国王的思路,处理本题。

首先,我们需要明确,题目的要求:

  1. 统计方案数
  2. 有些土地不能种植

状态设计
首先,我们得明确状态是什么。

我们这个状态,肯定是要统计方案数。

我们这个状态,必然需要表示每一行土地种植的状态。

因此得到:

f [ i ] [ s ] 表示已经种植前 i 行,且第 i 行种植的状态为 s 的方案数 f[i][s]表示已经种植前i行,且第i行种植的状态为s的方案数 f[i][s]表示已经种植前i行,且第i行种植的状态为s的方案数

状态转移
题目的限制条件,其实就是我们转移的限制条件。

我们知道,这里是十字形的禁止种植,也就是上下左右不能有相邻的两棵玉米。

那么怎么判断呢?

如果说我们把 1 1 1表示这个地方种植玉米, 0 0 0表示不种植
S = 11101 , 2 , 3 这三个地方种玉米,第四个地方不种植玉米 S=11101,2,3这三个地方种玉米,第四个地方不种植玉米 S=11101,2,3这三个地方种玉米,第四个地方不种植玉米

对于一行而言,不能种植相邻的玉米。

即:

对于一行而言,不能有相邻的 1 1 1
S = 1110 是不合法的状态 S=1110是不合法的状态 S=1110是不合法的状态

对于相邻的两行而言,不能在同一列都种植玉米

a = 1010 b = 1000 这是不可以的,在第一个位置会出现上下矛盾 a=1010\\ b=1000\\ 这是不可以的,在第一个位置会出现上下矛盾 a=1010b=1000这是不可以的,在第一个位置会出现上下矛盾
那么我们可以转化为:
在这里插入图片描述
最后,对于题目中的土地不能种植,我们可以认为。
如果第 i 行的状态为 s ,那么荒废土地处不能有 1 如果第i行的状态为s,那么荒废土地处不能有1 如果第i行的状态为s,那么荒废土地处不能有1

我们可以设计一个数组:
g [ i ] 表示第 i 行不能种植土地的状态 g [ 1 ] = 1011 表示第一行,第一个,第三个,第四个位置不能种植玉米 g[i]表示第i行不能种植土地的状态\\g[1]=1011表示第一行,第一个,第三个,第四个位置不能种植玉米 g[i]表示第i行不能种植土地的状态g[1]=1011表示第一行,第一个,第三个,第四个位置不能种植玉米
总而言之

在这里插入图片描述

2.2代码实现
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>using namespace std;const int N = 14, M = 1 << 12, mod = 1e8;int n, m;
int w[N];
vector<int> state;
vector<int> head[M];
int f[N][M];//判断有没有相邻的两个1
bool check(int state)
{for (int i = 0; i + 1 < m; i ++ )if ((state >> i & 1) && (state >> i + 1 & 1))return false;return true;
}int main()
{cin >> n >> m;for (int i = 1; i <= n; i ++ )for (int j = 0; j < m; j ++ ){int t;cin >> t;//荒废土地是0,我们在次转换为1w[i] += !t * (1 << j);}for (int i = 0; i < 1 << m; i ++ )if (check(i))//这个状态不存在种植左右相邻的玉米state.push_back(i);for (int i = 0; i < state.size(); i ++ )for (int j = 0; j < state.size(); j ++ ){int a = state[i], b = state[j];if (!(a & b))//a对应的状态和j对应的状态没有在同一列种植玉米head[i].push_back(j);}f[0][0] = 1;for (int i = 1; i <= n + 1; i ++ )for (int j = 0; j < state.size(); j ++ )//在第i行,状态j是否满足在荒废土地上种植玉米if (!(state[j] & w[i]))//从上一行j对应的状态,转到本行i对应的状态for (int k : head[j])f[i][j] = (f[i][j] + f[i - 1][k]) % mod;//表示第n+1行什么都没种植的状态,其实就是累加f[n][S]cout << f[n + 1][0] << endl;return 0;
}

3.炮兵阵地

司令部的将军们打算在 N × M N×M N×M的网格地图上部署他们的炮兵部队。

一个 N × M N×M N×M的地图由 N N N M M M列组成,地图的每一格可能是山地(用 H H H 表示),也可能是平原(用 P P P 表示),如下图。

在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:

在这里插入图片描述
如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。

图上其它白色网格均攻击不到。

从图上可见炮兵的攻击范围不受地形的影响。

现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。

输入格式
第一行包含两个由空格分割开的正整数,分别表示 N N N M M M

接下来的 N N N行,每一行含有连续的 M M M 个字符( P P P 或者 H H H),中间没有空格。按顺序表示地图中每一行的数据。

输出格式
仅一行,包含一个整数 K K K,表示最多能摆放的炮兵部队的数量。

数据范围
N ≤ 100 , M ≤ 10 N≤100,M≤10 N100,M10
输入样例:

5 4
PHPP
PPHH
PPPP
PHPP
PHHP

输出样例:

6

只看了一半…

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

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

相关文章

全国产EtherCAT运动控制边缘控制器(五):IO配置与回零运动的Python+Qt开发

今天&#xff0c;正运动小助手给大家分享一下全国产EtherCAT运动控制边缘控制器ZMC432H如何使用PythonQT实现单轴回零运动控制开发。 01 功能简介 全国产EtherCAT运动控制边缘控制器ZMC432H是正运动的一款软硬件全国产自主可控&#xff0c;运动控制接口兼容EtherCAT总线和脉冲…

Elasticsearch使用——结合MybatisPlus使用ES es和MySQL数据一致性 结合RabbitMQ实现解耦

前言 本篇博客是一篇elasticsearch的使用案例&#xff0c;包括结合MybatisPlus使用ES&#xff0c;如何保证MySQL和es的数据一致性&#xff0c;另外使用了RabbitMQ进行解耦&#xff0c;自定义了发消息的方法。 其他相关的Elasticsearch的文章列表如下&#xff1a; Elasticsear…

【无人机】太阳能伪卫星VoLTE无人机设计(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MySQL数据库简单安装

MySQL介绍 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系数据库管…

acme.sh: 未找到命令解决办法丨acme命令安装ssl证书

在Freessl申请的ssl证书现在都是需要acme命令了&#xff0c;服务器没有自带所以会出现这个报错&#xff0c;首先 1、安装并下载&#xff1a; curl https://get.acme.sh | sh -s emailmyexample.com2、进入到安装目录,创建指令别名&#xff1a; cd /root/.acme.sh/ alias acm…

电脑删除的视频怎么恢复?可尝试着3钟恢复办法!

无论是为了工作还是生活&#xff0c;我们都有可能在电脑上保存重要的视频&#xff0c;如宣传视频、回忆录视频等。这些视频通常包含了制作者的心血&#xff0c;要是被我们误删除了&#xff0c;很难重新拍摄&#xff0c;那么电脑删除的视频怎么恢复&#xff1f; 能。通常&#…

大托,如何站上天心南部的价值高地?

作者 | 魏启扬 陈宇航 来源 | 洞见新研社 陈飞 摄 “商贾云集于四方&#xff0c;市井数盈于万户”&#xff0c;长沙南城古往今来生生不息的热辣与烟火&#xff0c;每隔一段时间&#xff0c;都会有璀璨的迸发。 才在“加长版”黄金周释放了“不夜南城”的魅力&#xff0c;第…

正点原子嵌入式linux驱动开发——pinctrl和gpio子系统

在上一篇笔记中&#xff0c;学习编写了基于设备树的LED驱动&#xff0c;但是驱动的本质还是没变&#xff0c;都是配置LED灯 所使用的GPIO寄存器&#xff0c;驱动开发方式和裸机基本没区别。Linux是一个庞大而完善的系统&#xff0c;尤其是驱动框架&#xff0c;像GPIO这种最基本…

快速了解服务器单CPU与双CPU

​  在当今快节奏的技术环境中&#xff0c;用户们对功能强大且高效的服务器配置需求不断增长。CPU作为构成任何计算基础设施的骨干&#xff0c;服务器的“大脑”&#xff0c;负责执行计算、控制数据流并协调各个组件之间的任务&#xff0c;是服务器选择硬件中的重要一环。因此…

Vue2之防抖_debounce封装函数v-debounce自定义指令(传参/不传)

目录 1、防抖 2、debounce - 封装函数 3、v-debounce 全局自定义指令 1、防抖 推荐文章 &#xff1a; https://blog.csdn.net/weixin_58099903/article/details/119902796 2、debounce - 封装函数 utils / tools.js /*** 函数防抖 是n秒后延迟执行&#xff0c;多用于页面scr…

Java虚拟机常见面试题总结

梳理Java虚拟机相关的面试题&#xff0c;主要参考《深入理解Java虚拟机 JVM高级特性与最佳实践》(第2版, 周志明 著)一书&#xff0c;其余部分整合网络相关内容。注意&#xff0c;关于Java并发编程的面试题因为内容较多&#xff0c;单独整理。Java基础相关的面试题可以参考Java…

海外调查问卷赚钱是真的吗?

海外问卷赚钱是真实的吗&#xff1f;我是橙河网络&#xff0c;一家问卷公司的老板&#xff0c;做这个行业已经2年时间了&#xff0c;首先给大家一个明确的回答&#xff1a;海外问卷调查赚钱是真实的&#xff01; 海外问卷调查项目&#xff0c;在国内已经存在一二十年的时间了&…

Kali Linux 安装搭建 hadoop 平台 详细教程

1&#xff09;前期环境准备&#xff1a;&#xff08;虚拟机、jdk、ssh&#xff09; 2&#xff09;SSH相关配置 安装SSH Server服务器&#xff1a;apt-get install openssh-server 更改默认的SSH密钥 cd /etc/ssh mkdir ssh_key_backup mv ssh_host_* ssh_key_backup 创建新…

AUTOSAR AP硬核知识点梳理(1)

一 什么是 Adaptive AUTOSAR? Adaptive AUTOSAR是一种新的汽车软件框架,旨在满足现代汽车行业中不断增长的技术需求。随着汽车变得越来越智能,对处理器的性能要求也在不断增长。 Adaptive AUTOSAR旨在通过提供高性能计算和通信机制以及灵活的软件配置来满足这些需求,为车…

利用特殊反序列化组件攻击原生反序列化入口

目录 前言 本文所述攻击的本质是将上述组件中的类拼接到反序列化利用利用链中&#xff0c;打的是Serilizable入口&#xff0c;而不是特殊反序列化入口 攻击原理 利用链分析 readObject()->任意类toString() HotSwappableTargetSource & XString BadAttributeValue…

静态路由与双线BFD热备份

✍ 路由具体是什么概念&#xff1f; ✍ 路由表和路由协议有什么关系&#xff1f; ✍ 电信联通双线如何做路由热备份&#xff1f; ---- 什么叫路由&#xff1f; ---- 路由器 - 网络设备 - 转发数据 - 要有一张地图 - 路由表 ---- 路由表 - 指明要到达某个目…

Apache Doris (四十五): Doris数据更新与删除 - Sequence 列

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. 基本原理

安装mmcv及GPU版本的pytorch及torchvision

一、先装GPU版本的pytorch和torchvision pip install torch1.9.1cu111 torchvision0.10.1cu111 torchaudio0.9.1 -f https://download.pytorch.org/whl/torch_stable.html注意&#xff1a;以上适用cuda11.1版本 如果想离线安装&#xff0c;就看这篇文章 二、安装mmcv 看这篇…

奥威BI数据可视化:让各层级管理快速获取信息

都说众口难调&#xff0c;企业各层级管理者想分析的维度不同&#xff0c;急需获取的数据信息不同&#xff0c;怎么才能第一时间满足企业各层级管理者的分析需求&#xff1f;奥威BI数据可视化软件的做法是利用多维动态自助分析实现随时随地按需分析。 多维动态分析功能支持用户…

MATLAB——神经网络参考代码

欢迎关注“电击小子程高兴的MATLAB小屋” %% I. 清空环境变量 clear all clc %% II. 训练集/测试集产生 %% % 1. 导入数据 load spectra_data.mat %% % 2. 随机产生训练集和测试集 temp randperm(size(NIR,1)); %打乱60个样本排序 % 训练集——50个样本 P_train NIR(…