备战蓝桥杯---状态压缩DP基础1之棋盘问题

它只是一种手段,一种直观而高效地表示复杂状态的手段。

我们先来看一道比较基础的:

直接DFS是肯定不行,我们发现对某一行,只要它前面放的位置都一样,那么后面的结果也一样。

因此我们考虑用DP,并且只有0/1,我们用二进制压缩。

我们令f[i][st]表示前i行状态为st的个数。

我们易得状态转移方程为:f[i][st]=\sum f[i-1][st'](第i行放在第j列)

同时我们保证(st'&(1<<(j-1))==0&&st'+1<<(j-1)==st。

但是我们会遇到一个问题:怎么枚举st?

其实,我们可以不用二维数组,从1二进制枚举到1<<(n)-1,因为得到它的肯定比他小,肯定是计算过的,因此我们可以这么做,这里假设状态为1101,那我们如何获得1100,1001,0101呢?

用lowerbit操作,x&-x就得到了X中最低位的1及其后面的0,这样子就ok了。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,dp[1<<20],bu[25],x,y;
int lowerbit(int x){return (x&(-x));
}
int main(){cin>>n>>m;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);bu[x]+=1<<(y-1);}int j,cnt;dp[0]=1;for(int i=1;i<=((1<<n)-1);i++){j=i;cnt=0;while(j!=0){j-=lowerbit(j);cnt++;}j=i;while(j!=0){int fk=lowerbit(j);if((fk&bu[cnt])==0){dp[i]+=dp[i^fk];}j-=fk;}}cout<<dp[(1<<n)-1];	
}

让我们看看比较有意思的题吧:

首先,如果我们一个一个看DFS的话,我们会发现第二个位置不像八皇后范围很容易确认+81个格子,时间不允许,用一般的DP实现起来很麻烦,因为当我们要放一个国王时,我们还得知道能不能放,即不满足无后效性。

于是我们可以换一种思路:

我们一行一行看,这样子,当我们放当前行时,关注的只有上一行,而在这一行只要不相邻即可。

我们令放了国王为1,没放为0.

现在我们看是否合法:

1.同一行不相邻:(x&(x<<1))==0(注意加括号)

2.如果上一行的状态为x,当前为y,xy要满足什么条件合法?

(x&y)==0 (x&(y<<1))==0 (x&(y>>1))==0

因此,我们令f[i][j][k]表示第i行,状态为k时已经放了j个的方案数;

易得状态转移方程:

f[i][j][k]+=f[i-1][j-num(k)][p](k自己合法,p也合法,(k&p)==0 (k&(p<<1))==0 (k&(p>>1))==0)

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,k,num[1500];
long long dp[10][90][1000];
int calc(int num){int ans=0;while(num!=0){if((num&1)==1) ans++;num>>=1;}return ans;
}
int main(){cin>>n>>k;dp[0][0][0]=1;for(int i=0;i<(1<<n);i++){//打表num[i]=calc(i);}for(int i=1;i<=n;i++){for(int j=0;j<=k;j++){for(int st=0;st<(1<<n);st++){if((st&(st<<1))!=0) continue;if(num[st]>j) continue;for(int p=0;p<(1<<n);p++){if((p&(p<<1))!=0) continue;if((p&(st<<1))!=0) continue;if((p&(st>>1))!=0) continue;if((p&(st))!=0) continue;dp[i][j][st]+=dp[i-1][j-num[st]][p];}}}}long long ans=0;for(int st=0;st<(1<<n);st++){ans+=dp[n][k][st];}cout<<ans;
}

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

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

相关文章

Vue3+Element-Plus中ELMessage样式丢失处理

Vu3Element-Plus项目中,element-plus使用按需引入有时会出现样式失效和在vscode中使用会报错[找不到名称“ElMessage”。ts(2304)]错误 ELMessage弹框样式丢失处理方法 使用按需引入就不能手动再引入 import { ElMessage } from "element-plus";ElMessage.success…

蓝桥杯-单片机组基础6——定时计数器与外部中断混合使用(附小蜜蜂课程代码)

蓝桥杯单片机组备赛指南请查看这篇文章&#xff1a;戳此跳转蓝桥杯备赛指南文章 本文章针对蓝桥杯-单片机组比赛开发板所写&#xff0c;代码可直接在比赛开发板上使用。 型号&#xff1a;国信天长4T开发板&#xff08;绿板&#xff09;&#xff0c;芯片&#xff1a;IAP15F2K6…

常见的浏览器跨域解决方法

1. 前端方法&#xff1a;JSONP&#xff08;仅适用于GET请求&#xff09; JSONP&#xff08;JSON with Padding&#xff09;是一种利用<script>标签的src属性不受同源策略限制的特性来实现跨域数据请求的方法。JSONP通过在前端动态创建<script>标签&#xff0c;并将…

4.1.CVAT——目标检测的标注详细步骤

文章目录 1. 进入任务1. 创建任务2. 已创建的task3. 进入标注界面 2. 选择标注类型2.1 选择标注类型2.2 进行标注2.3 遮挡 2.快捷键3.导出标注结果 1. 进入任务 登录后会看到如下图界面&#xff0c;CVAT的标注最小单位是Task&#xff0c;每个Task为一个标注任务。点击Task按钮…

[法规规划]国家数据局局长刘烈宏《激活数据要素价值》演讲要点解析

国家数据局党组书记、局长刘烈宏在北大光华论坛上发表了题为《激活数据要素价值》的演讲&#xff0c;当时曾极大推动了市场热度&#xff0c;引发了行业思考。现在演讲过去了一段时间&#xff0c;但是温故而知新&#xff0c;我们不妨结合演讲之后的市场反应&#xff0c;回顾一下…

蚓链数字化快速转型五步

数字化转型对于许多企业来说是一个头痛的问题&#xff0c;因为他们可能感到缺乏明确的方向和方法。不过&#xff0c;蚓链数字化生态系统提出了一套快速转型五步法&#xff0c;旨在帮助企业明确目标、建立团队、设计权益、提供思维和方法&#xff0c;并共享生态资源&#xff0c;…

【java任意文件漏洞修复,使用文件魔数解决】

java任意文件漏洞修复&#xff0c;使用文件魔数解决 背景&#xff1a; 客户进行渗透测试&#xff0c;验证上传文件的程序没有对上传文件作任何过滤&#xff0c;导致可以上传任意文件到服务器&#xff0c;甚至是病毒文件和Webshell木马文件。 解决办法&#xff1a;对于上传的附件…

html基本标签

<h1></h1> <p></p> h是标签从h1~h6&#xff0c;没用h7,h8 p是段落 <a href"https://www.educoder.net">Educoder平台</a> href可以指定链接进行跳转 <img src"https://www.educoder.net/attachments/download/2078…

【论文精读】DALLE: Zero-Shot Text-to-Image Generation零样本文本到图像生成

文章目录 一、前言二、摘要三、方法&#xff08;一&#xff09;主要目标&#xff08;二&#xff09;stage 1&#xff1a;训练离散变分自动编码器&#xff08;dVAE&#xff09;&#xff08;三&#xff09;stage 2&#xff1a;训练自回归转换器&#xff08;四&#xff09;公式表达…

「优选算法刷题」:最后一块石头的重量

一、题目 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出两块 最重的 石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#xff1a; 如果 x y&#xff0c;那么两块石头…

Flutter开发之CupertinoApp

Flutter开发之CupertinoApp 最近由于使用Flutter编程更多&#xff0c;使用Flutter更顺手&#xff0c;相对于其他前端框架来说&#xff0c;Flutter在跨平台、响应式UI、自绘引擎、即插即用的组件和庞大的社区生态支持方面有更大的优势&#xff1b;Flutter拥有更低的学习成本&am…

2024牛客寒假算法基础集训营5 H sakiko的排列构造(hard)个人补题o(╥﹏╥)o

sakiko要构造一个长度为 nnn 的排列 ppp &#xff0c;使得每一个 pii (1≤i≤n)p_ii\ (1\leq i\leq n)pi​i (1≤i≤n) 都是质数。 排列的定义为&#xff1a;长度为 nnn 的数组&#xff0c;其中 1−n1-n1−n 每个数字在数组中各出现一次。 输入描述: 第一行输入一个整数 n(1…

gpt批量工具,gpt批量生成文章工具

GPT批量工具在今天的数字化时代扮演着越来越重要的角色&#xff0c;它们通过人工智能技术&#xff0c;可以自动批量生成各种类型的文章&#xff0c;为用户提供了便利和效率。本文将介绍5款不同的GPT批量工具&#xff0c;并介绍一款知名的147GPT生成工具&#xff0c;以及另外一款…

c++/c图的邻近矩阵表示

#include<iostream> using namespace std;#define MaxVerterNum 100 typedef char VerterType; typedef int EdgeType; typedef struct {VerterType vexs[MaxVerterNum]; // 存储顶点EdgeType edges[MaxVerterNum][MaxVerterNum]; // 存储邻接矩阵int n, e; // 顶点数和边…

JVM堆内存中新生代晋升到老年代的条件

1. 一般年龄判断 当对象在Eden区中经过第一次 Minor GC 后&#xff0c;如果仍然存活&#xff0c;则会被移动到 From Survivor 区&#xff0c;并且对象的年龄设为 1。每经过一次 Minor GC&#xff0c;存活下来的对象年龄加 1&#xff0c;若存活对象在 From Survivor 区的年龄达…

netlink原理及应用

什么是netlink netlink是一种基于网络的通信机制&#xff0c;允许内核内部、内核与用户态应用之间甚至用户态应用之间进行通信&#xff1b;netlink的主要作用是内核与用户态之间通信&#xff1b;它的思想是&#xff0c;基于BSD的socket使用网络框架在内核和用户态之间进行通信…

GaussDB跨云容灾:实现跨地域的数据库高可用能力

背景 金融、银行业等对数据的安全有着较高的要求&#xff0c;同城容灾建设方案&#xff0c;在绝大多数场景下可以保证业务数据的安全性&#xff0c;但是在极端情况下&#xff0c;如遇不可抗力因素等&#xff0c;要保证数据的安全性&#xff0c;就需要采取跨地域的容灾方案。 …

Dell R730 2U服务器实践3:安装英伟达上代专业AI训练Nvidia P4计算卡

Dell R730是一款非常流行的服务器&#xff0c;2U的机箱可以放入两张显卡&#xff0c;这次先用一张英伟达上代专业级AI训练卡&#xff1a;P4卡做实验&#xff0c;本文记录安装过程。 简洁步骤&#xff1a; 打开机箱将P4显卡插在4号槽位关闭机箱安装驱动 详细步骤&#xff1a; 对…

2024目前三种有效加速国内Github

大家好我是咕噜美乐蒂&#xff0c;很高兴又和大家见面了&#xff01;截至2024年&#xff0c;国内访问 GitHub 的速度受到多种因素的影响&#xff0c;包括网络封锁、地理距离、网络带宽等。为了提高国内用户访问 GitHub 的速度&#xff0c;以下是目前较为有效的三种加速方式&…

网络工程师学习笔记——VRP配置命令大全

VRP是Versatile Routing Platform的简称&#xff0c;它是华为公司数据通信产品的通用网络操作系统。它以IP业务为核心&#xff0c;采用组件化的体系结构&#xff0c;在实现丰富功能特性的同时&#xff0c;还提供了基于应用的可裁剪和可扩展的功能&#xff0c;使得路由器和交换机…