状态压缩dp[详解 + 例题]

1 . 题目 

2 . 分析

可以发现 : 横放的方案数 == 总方案数 ;

        剩下的都是竖放去填补空缺 ;

关于状态定义 : 

考虑按列拜访 , 某列的隔行用0/1表示摆放状态 ;

某行为1 : 表示横放 , 0 : 表示竖放 ;

状态表示 :

f[i][j] : 表示拜访第i列,状态为j的方案数 ;

状态转移 : 

f[i-1][k] --> f[i-1][j];

其中k表示i-1列并且能够与j匹配的状态  : 

状态计算 : 

f[i,j] = sum(f[i-1],k) ;

初值 : 

f[0][0] = 1;

目标 : 

f[m , 0]

3 . 代码 :  

链接 : 

291. 蒙德里安的梦想 - AcWing题库

#include<bits/stdc++.h>
using namespace std;
const int N =  110 ;
bool st13N];
int f[13][2050] ; 
int main(){int n , m ; while(cin >> n >> m ,m||n){// 预处理 : 判断合并列的状态i是否合法// 合并列1表示横放 , 0表示竖放 // 如果合并列存在连续奇数个0,为非法状态,反之合法 // 比如n=4的时候,合法状态有0(0000),3(0011),9(1001),12(11010),15(1111) for(int i=0;i< 1<<n ;i++){ // 枚举到2^n-1,一共2^n个状态st[i] = true ;int cnt = 0 ; // 记录合并列中连续0的个数for(int j=0;j<n;j++){//从低位到高位移 if(i>>j & 1){ // 如果是1 if(cnt&1){st[i] = false ;break ;// 记录i不合法 }}else cnt ++ ;// 如果是0 , 记录0的个数 	} if(cnt & 1) st[i] = false ;//如0100,要判断高位0的情况 }// 状态计算 : memset(f , 0 , sizeof f) ;f[0][0] = 1 ;// 第0列不横放是一种合法的方案for(int i=1;i<=m;i++){// 阶段 : 枚举列 for(int j=0;j< 1<<n ;j++){ // 状态 : 枚举第i列的状态for(int k=0;k< 1<<n;k++){ // 枚举第i-1列的状态 // 不出现重叠的1,不出现连续的奇数个0if((j&k)==0 && st[j|k]){f[i][j] += f[i-1][k] ;// 前一列兼容状态的方案数之和 } } }} cout << f[m][0] << endl ;// 第m列,不横放,即答案 	}
}

 4 . 参考

E31 状态压缩DP 蒙德里安的梦想_哔哩哔哩_bilibili

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

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

相关文章

开始时间大于结束时间

1.dom中代码&#xff0c;监听所选日期值的变化&#xff0c;并把需要比较的时间字段作为参数传到监听方法中&#xff0c; <el-form-item label"起始日期" prop"startTime"><el-date-picker clearable size"small":disabled"isDisa…

多线程的学习1

多线程 线程是操作系统能够进入运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 进程&#xff1a;是程序的基本执行实体。 并发&#xff1a;在同一个时刻&#xff0c;有多个指令在单个CPU上交替执行。 并行&#xff1a;在同一时刻&#xff0c…

SSL证书一年多少钱?有便宜的吗?

SSL安全证书的价格因其类型、品牌、验证级别、附加功能&#xff08;如多域名支持、通配符功能等&#xff09;以及购买时长&#xff08;通常以年为单位&#xff09;的不同而有所差异。以下是大致的价格范围&#xff1a; 永久免费SSL证书_永久免费https证书_永久免费ssl证书申请…

【C++的奇迹之旅】C++关键字命名空间使用的三种方式C++输入输出命名空间std的使用惯例

文章目录 &#x1f4dd;前言&#x1f320; C关键字(C98)&#x1f309; 命名空间&#x1f320;命名空间定义&#x1f309;命名空间使用 &#x1f320;命名空间的使用有三种方式&#xff1a;&#x1f309;加命名空间名称及作用域限定符&#x1f320;使用using将命名空间中某个成员…

HarmonyOS 应用开发之UIAbility组件间交互(设备内)

UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时&#xff0c;会涉及到启动特定的UIAbility&#xff0c;该UIAbility可以是应用内的其他UIAbility&#xff0c;也可以是其他应用的UIAbility&#xff08;例如启动三方支付UIAbility&#xff09;。 本文将从如下场景…

consul集群部署三server一client

环境&#xff1a; consul&#xff1a;consul_1.16.2_linux_amd64.zip centos7.9 server:192.168.50.154 192.168.50.155 192.168.50.156 client:192.168.70.64 安装目录&#xff1a; [rootrabbit4-64 consul]# pwd /app/consul [rootrabbit4-64 consul]# ls consul consul_1…

Linux-进程控制

&#x1f30e;进程控制【上】 文章目录&#xff1a; 进程控制 为什么要有地址空间和页表 程序的内存       程序申请内存使用问题 写时拷贝与缺页中断 父子进程代码共享       为什么需要写时拷贝       页表的权限位       缺页中断 退出码和错误码…

内源 npm 无法同步官方 npm 解法

内源的 NPM 通常通过 npm config set registry http://内网 全局配置了内源 NPM&#xff0c;采用 T1 进行官方 NPM 的缓存同步。 但可能会存在没有 sync 机制的场景&#xff0c;当依赖的一个外部包发了新版本是无法立即消费的。 可以采用以下方式修正。 1. scope 限制 regis…

2024年第十届国际虚拟现实大会(ICVR 2024)即将召开!

会议面向虚拟现实、增强现实、人工智能等互联网新技术领域的专家及学者&#xff0c; 致力于共同促进国内外虚拟现实的发展与应用。 2014年至今&#xff0c;ICVR在全球新加坡&#xff0c;美国洛杉矶&#xff0c;中国成都&#xff0c;香港等国家及地区召开&#xff0c;面向虚拟现…

【项目技术介绍篇】若依开源项目RuoYi-Cloud后端技术介绍

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

用友BI告诉你,分析指标计算也可以很简单

分析数据&#xff0c;特别是分析财务数据&#xff0c;要计算得分析指标都非常多&#xff0c;涉及的数据来源也是各有不同&#xff0c;一旦哪个环节出了错就一切都得重来。难道分析指标的计算就没有更快更简单的办法了&#xff1f;奥威-用友BI告诉你&#xff0c;分析指标计算有别…

项目模块—实现抑郁测评(小程序)

script <script setup> import { ref } from "vue";//控制轮播图页码 let current ref(0);//答题逻辑 const add (value) > {if (current.value < 9) {current.value current.value 1;} else {uni.switchTab({url: "/pages/my/my",});} }…