状压DP

状压DP

对于数据范围n<=20的可以考虑状压DP

1.蒙德里安的梦想

题目描述

求把 N × M N×M N×M 的棋盘分割成若干个 1×2 的的长方形,有多少种方案。

例如当$ N=2,M=4$ 时,共有 5 种方案。当 N = 2 , M = 3 N=2,M=3 N=2M=3 时,共有 3 种方案。

如下图所示:

2411_1.jpg

输入格式

输入包含多组测试用例。

每组测试用例占一行,包含两个整数 N 和 M。

当输入用例 N=0,M=0 时,表示输入终止,且该用例无需处理。

输出格式

每个测试用例输出一个结果,每个结果占一行。

数据范围

1 ≤ N , M ≤ 11 1≤N,M≤11 1N,M11

输入样例

1 2
1 3
1 4
2 2
2 3
2 4
2 11
4 11
0 0

输出样例

1
0
1
2
3
5
144
51205

分析

状压DP模板题,本题若横着放的长方形确定,其他就只能竖着放,所以我们只需要考虑横着放的所有状态,定义f[i,j]为第i列伸出到第i+1列的状态为j的方案数,对于状压DP,每次假定前一个状态为k,则k为第i-1列伸到第i列的状态,枚举所有的j和k,判断是否符合条件即可

这里的条件是

  • j和k的每一位不能同时为1,否则会出现长度为3的长方形: j & k = = 0 j\&k==0 j&k==0

  • 第i列不能出现连续的奇数空,这里我们会出现一个问题,如何求第i列的状态,很容易想道第i列的状态是由第i-1伸到第i列和第i列伸到第i+1列共同引起的,所以第i列状态为 j ∣ k j|k jk,对于每一列的状态,我们可以预处理一个st数组,届时判断 s t [ j ∣ k ] st[j|k] st[jk]是否为真即可

代码
#include<bits/stdc++.h>
#define int long long
using namespace std;const int N=12,M=(1<<11)+10;
int dp[N][M];
bool st[M];
void init(int n)
{for(int i=0;i<1<<n;i++){st[i]=true;int cnt=0;for(int j=0;j<n;j++){int k=i>>j&1;if(k){if(cnt&1) st[i]=false;cnt=0;}else cnt++;}if(cnt&1) st[i]=false;}
}
signed main()
{int n,m;while(cin>>n>>m){if(n==0&&m==0) break;init(n);memset(dp,0,sizeof(dp));dp[0][0]=1;for(int i=1;i<=m;i++){for(int j=0;j<1<<n;j++){for(int k=0;k<1<<n;k++){if((k&j)==0&&st[k|j]==true){dp[i][j]+=dp[i-1][k];}}}}cout<<dp[m][0]<<endl;}return 0;
}

2.最短哈密顿距离

题目描述

给定一张 n 个点的带权无向图,点从 0 ∼ n − 1 0∼n−1 0n1 标号,求起点 0 到终点 n − 1 n−1 n1的最短 Hamilton 路径。

Hamilton 路径的定义是从 0 0 0 到 n−1不重不漏地经过每个点恰好一次。

输入格式

第一行输入整数 n n n

接下来 $n $行每行 n n n 个整数,其中第 i i i 行第$ j 个整数表示点 个整数表示点 个整数表示点 i$ 到 $j 的距离(记为 的距离(记为 的距离(记为 a[i,j]$)。

对于任意的 x , y , z x,y,z x,y,z,数据保证 a [ x , x ] = 0 , a [ x , y ] = a [ y , x ] a[x,x]=0,a[x,y]=a[y,x] a[x,x]=0a[x,y]=a[y,x] 并且$ a[x,y]+a[y,z]≥a[x,z]$。

输出格式

输出一个整数,表示最短 Hamilton 路径的长度。

数据范围

1 ≤ n ≤ 20 1≤n≤20 1n20
0 ≤ a [ i , j ] ≤ 1 0 7 0≤a[i,j]≤10^7 0a[i,j]107

输入样例

5
0 2 4 5 1
2 0 6 5 3
4 6 0 8 3
5 5 8 0 5
1 3 3 5 0

输出样例

18

分析

定义 f [ i , j ] f[i,j] f[i,j]为以j为终点,通过路径状态压缩后为i的所有方案,最终答案是 f [ 1 < < n − 1 ] [ n − 1 ] f[1<<n-1][n-1] f[1<<n1][n1],用k表示前一个状态,枚举所有的j,i,k,判断i内是否包含终点j和前一个点k,若包含,则 f [ i , j ] = M i n ( f [ i , j ] , f [ i − { j } ] [ k ] + a [ k , j ] ) f[i,j]=Min(f[i,j],f[i-\{j\}][k]+a[k,j]) f[i,j]=Min(f[i,j],f[i{j}][k]+a[k,j])

代码

#include<bits/stdc++.h>#define int long longusing namespace std;const int N=20,M=(1<<20)+10,inf=LLONG_MAX/2;int f[M][N];
int a[N][N];
signed main()
{int n;cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>a[i][j];int res=inf;memset(f,0x3f,sizeof(f));f[1][0]=0;int cnt=0;for(int j=1;j<n;j++){for(int i=0;i<1<<n;i++){if(i&1==0) continue;if(i>>j&1){for(int k=0;k<n;k++){if(i>>k&1){f[i][j]=min(f[i][j],f[i-(1<<j)][k]+a[k][j]);}}}}}cout<<f[(1<<n)-1][n-1]<<endl;return 0;
}

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

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

相关文章

windows 创建新用户,并分配到指定组

右击电脑 -> 点击管理 在右边右击&#xff0c;选择新用户&#xff0c;输入相关信息创建 创建用户后&#xff0c;选择用户&#xff0c;右击&#xff0c;选择属性&#xff0c;添加 点击高级 点击立即查找&#xff0c;可以搜索出所有可用的组&#xff0c;为其选择即可

Java XML

1、XML文件介绍 配置文件&#xff1a;用来保存设置的一些东西。 拿IDEA来举例&#xff0c;比如设置的背景图片&#xff0c;字体信息&#xff0c;字号信息和主题信息等等。 &#xff08;1&#xff09;以前是用txt保存的&#xff0c;没有任何优点&#xff0c;而且不利于阅读&a…

停车位检测-停车场车位识别

YOLO Parking Spot 概述 停车场获取的图像训练了四个YOLO模型来检测车辆。目标是收集信息&#xff0c;并可能开发一种停车解决方案以改善交通流量并优化空间利用率。通过识别汽车&#xff0c;我们生成了一份报告&#xff0c;其中包含图像细节&#xff0c;如可用停车位的数量、…

官宣:Zilliz 在亚马逊云科技中国区正式开服!

01 Zilliz Cloud 正式上线亚马逊云科技宁夏区服务 9 月 4 日&#xff0c;Zilliz 正式官宣&#xff0c; Zilliz Cloud 正式上线亚马逊云科技在宁夏区的云服务。至此&#xff0c;Zilliz Cloud 已实现全球 5 大云 19 个节点 的全覆盖&#xff0c;成为全球首个提供海内外多云服务的…

《机器学习》—— SVD奇异值分解方法对图像进行压缩

文章目录 一、SVD奇异值分解简单介绍二、代码实现—SVD奇异值分解方法对图像进行压缩 一、SVD奇异值分解简单介绍 SVD&#xff08;奇异值分解&#xff09;是一种在信号处理、统计学、线性代数、机器学习等多个领域广泛应用的矩阵分解方法。它将任何 mn 矩阵 A 分解为三个特定矩…

从0书写一个softmax分类 李沐pytorch实战

输出维度 在softmax 分类中 我们输出与类别一样多。 数据集有10个类别&#xff0c;所以网络输出维度为10。 初始化权重和偏置 torch.norma 生成一个均值为 0&#xff0c;标准差为0.01,一个形状为size(num_inputs, num_outputs)的张量偏置生成一个num_outputs 10 的一维张量&a…

Kubernetes从零到精通(10-服务Service)

Service简介 Deployment这种工作负载能管理我们应用Pod的副本数&#xff0c;并实现动态的创建和销毁&#xff0c;所以Pod本身是临时资源&#xff08;IP随时可能变化&#xff09;。现在如果某组Pod A需要访问另一组Pod B&#xff0c;A就需要在应用的配置参数里动态跟踪并更改B的…

【数学建模】相关系数

第一部分&#xff1a;相关系数简介 总体与样本&#xff1a; 总体&#xff1a;指研究对象的全体&#xff0c;比如全国人口普查数据。样本&#xff1a;从总体中抽取的一部分个体&#xff0c;如通过问卷调查收集的学生数据。 皮尔逊相关系数&#xff1a; 总体皮尔逊相关系数&…

Linux 8250串口控制器

1 8250串口类型的识别 Intel HW都使用DesignWare 8250&#xff1a; drivers/mfd/intel-lpss-pci.c drivers/tty/serial/8250/8250_dw.c IIR寄存器的高2位bit7、bit6用来识别8250串口的类型&#xff1a; 0 - 8250&#xff0c;无FIFO 0 - 并且存在SCR&#xff08;Scratch registe…

安科瑞Acrel-1000DP分布式光伏监控系统平台的设计与应用-安科瑞 蒋静

针对用户新能源接入后存在安全隐患、缺少有效监控、发电效率无法保证、收益计算困难、运行维护效率低等通点&#xff0c;提出的Acrel-1000DP分布式光伏监控系统平台&#xff0c;对整个用户电站全面监控&#xff0c;为用户实现降低能源使用成本、减轻变压器负载、余电上网&#…

如何构建大数据治理平台,助力企业数据决策

建设背景 &#xff08;1&#xff09;什么是数据资产 资产由企业及组织拥有和控制&#xff0c;能够提供增值服务、带来经济利益的重要资源。 资产不但需要管理&#xff0c; 更需要运营。 &#xff08;2&#xff09;数据资产运营中的问题 数据资产运营中存在的问题主要包括以下…

CANopen协议的理解

本文的重点是对CANopen协议的理解&#xff0c;不是编程实现 参考链接 canopen快速入门 1cia301协议介绍_哔哩哔哩_bilibili CANopen是什么&#xff1f; CANopen通讯基础&#xff08;上&#xff09;_哔哩哔哩_bilibili CANopen概述 图1. CAN报文标准帧的格式 CAN的报文可简单…

docker-compose 部署 flink

下载 flink 镜像 [rootlocalhost ~]# docker pull flink Using default tag: latest latest: Pulling from library/flink 762bedf4b1b7: Pull complete 95f9bd9906fa: Pull complete a880dee0d8e9: Pull complete 8c5deab9cbd6: Pull complete 56c142282fae: Pull comple…

Redis搭建集群

功能概述 Redis Cluster是Redis的自带的官方分布式解决方案&#xff0c;提供数据分片、高可用功能&#xff0c;在3.0版本正式推出。 使用Redis Cluster能解决负载均衡的问题&#xff0c;内部采用哈希分片规则&#xff1a; 基础架构图如下所示&#xff1a; 图中最大的虚线部分…

路由器WAN口和LAN口有什么不一样?

“ 路由器WAN口和LAN口的区别&#xff0c;WAN是广域网端口&#xff0c;LAN是本地网端口。WAN主要用于连接外部网络&#xff0c;而LAN用来连接家庭内部网络&#xff0c;两者主要会在标识上面有区别。以往大部分路由器的WAN只有一个&#xff0c;LAN口则有四个或以上&#xff0c;近…

《深度学习》—— 神经网络基本结构

前言 深度学习是一种基于神经网络的机器学习算法&#xff0c;其核心在于构建由多层神经元组成的人工神经网络&#xff0c;这些层次能够捕捉数据中的复杂结构和抽象特征。神经网络通过调整连接各层的权重&#xff0c;从大量数据中自动学习并提取特征&#xff0c;进而实现预测或…

Banana Pi BPI-SM9 AI 计算模组采用算能科技BM1688芯片方案设计

产品概述 香蕉派 Banana Pi BPI-SM9 16-ENC-A3 深度学习计算模组搭载算能科技高集成度处理器 BM1688&#xff0c;功耗低、算力强、接口丰富、兼容性好。支持INT4/INT8/FP16/BF16/FP32混合精度计算&#xff0c;可支持 16 路高清视频实时分析&#xff0c;灵活应对图像、语音、自…

Python面试宝典第48题:找丑数

题目 我们把只包含质因子2、3和5的数称作丑数&#xff08;Ugly Number&#xff09;。比如&#xff1a;6、8都是丑数&#xff0c;但14不是&#xff0c;因为它包含质因子7。习惯上&#xff0c;我们把1当做是第一个丑数。求按从小到大的顺序的第n个丑数。 示例 1&#xff1a; 输入…

基于MinerU的PDF解析API

基于MinerU的PDF解析API - MinerU的GPU镜像构建 - 基于FastAPI的PDF解析接口支持一键启动&#xff0c;已经打包到镜像中&#xff0c;自带模型权重&#xff0c;支持GPU推理加速&#xff0c;GPU速度相比CPU每页解析要快几十倍不等 主要功能 删除页眉、页脚、脚注、页码等元素&…

uniapp使用高德地图设置marker标记点,后续根据接口数据改变某个marker标记点,动态更新

最近写的一个功能属实把我难倒了,刚开始我请求一次数据获取所有标记点,然后设置到地图上,然后后面根据socket传来的数据对这些标记点实时更新,改变标记点的图片或者文字, 1:第一个想法是直接全量替换,事实证明这样不行,会很卡顿,有明显闪烁感,如果标记点比较少,就十几个可以用…