状压DP

news/2024/11/14 11:51:51/

状压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.ppmy.cn/news/1524294.html

相关文章

echarts 显示中国地图以及省份

这里使用echarts 4.9的版本显示中国地图&#xff0c;因为5.X的版本已经把地图模块分离出去了 可以从这里下载全国地图数据或各身份的数据 https://github.com/apache/echarts/tree/master/test/data/map 完整代码示例&#xff1a;中国地图 <!DOCTYPE html> <html&g…

全国各地身份证号开头6位数字及地区对照表

具体请前往&#xff1a;全国各地身份证号开头6位数字-省市县/区对照表

设计模式】Listener模式和Visitor模式的区别

文章目录 前言一、介绍Listener模式Visitor模式 二、代码实现2.1 Listener模式的Java实现2.2Listener模式的Go实现2.3Visitor模式的Java实现2.4Visitor模式的Go实现 三、总结 前言 在软件设计中&#xff0c;设计模式是解决特定问题的通用解决方案。Listener模式和Visitor模式是…

STL-stack/queue/deque(容器适配器)

目录 ​编辑 STL-stack 150. 逆波兰表达式求值 stack queue std::stack deque 性能测试 结构 STL-stack 栈的压入、弹出序列_牛客题霸_牛客网输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否可能为该栈的弹出顺序。假。题目…

信息安全国内外现状及技术要求示例(R155/R156)

国际政策、 法规的现状与趋势 鉴于对交通安全、社会安全甚至国家安全的重要影响&#xff0c;汽车网络安全、数据安全得到各相关国家和地区的高度重视&#xff0c;纷纷出台相关法规、标准。 信息安全法规 R155 法规适用范围覆盖了乘用车及商用车&#xff0c;适用于 M 类、N 类…

原生 input 中的 “type=file“ 上传文件

目标&#xff1a;实现文件上传功能 原型图&#xff1a; HTML部分&#xff1a; <div class"invoice-item"><div class"invoice-title">增值税专用发票</div><div class"invoice-box"><el-form-item label"标准…

C语言数组指针--自学笔记

一维数组指针 int a[3] {1,2,3}; int *pa a; //pa是一个整形的指针&#xff0c;pa 指针跨一个int大小的地址 int (*paa)[3] a; //paa是一个数组行指针, paa指针跨一行&#xff0c;3个int大小的地址 //a[n] *(pan) 二维数组指针 int b[2…

【H2O2|全栈】关于CSS(2)CSS基础(二)

目录 CSS基础知识 前言 准备工作 选择器的组合 盒模型 示例网页代码 后代选择器 亲代选择器 相邻兄弟选择器 后续兄弟选择器 多个元素选择器 通配符选择器 优先级 其他应用 伪类 锚链接的属性 列表的属性 list-style-type list-style-position list-style…