状态压缩DP

蒙德里安的梦想


分析题目,当我们先摆横着放的方块,再摆放竖着放的方块,当横着放的小方块摆放完后,竖着放的方块也就确定了,因此总方案数应该等于只放横着的小方块的合法方案数。我们考虑每一列可以摆放成功的小方块,每一种情况可以由一个二进制数来表示,位数等于行数。我们用f[i,j]f[i,j]f[i,j]来表示第iii列的第jjj个状态的合法方案数,可以知道f[i,j]f[i,j]f[i,j]可以由第i−1i - 1i−1列的状态转移过来,只要第i−1i-1i−1列的第kkk个状态与第iii列的第jjj个状态不重叠(jjj&kkk == 0),且摆放之后不存在连续奇数个0(无法竖着摆放,方案不合法),就代表f[i,j]f[i,j]f[i,j]可以由f[i−1,k]f[i-1,k]f[i−1,k]转移过来,且f[i,j]+=f[i−1,k]f[i,j] +=f[i-1,k]f[i,j]+=f[i−1,k].

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;const int N = 12, M = 1 << 12;int n, m;
long long f[N][M];
bool st[M];int main()
{while(cin >> n >> m, n || m){memset(f, 0, sizeof f);//预处理奇数个0的状态,将其标记for(int i = 0; i < 1 << n; i ++){st[i] = true;int cnt = 0;//将每一位取出来for(int j = 0; j < n; j ++){if(i >> j & 1){if(cnt & 1){st[i] = false;break;}}else cnt ++;}if(cnt & 1) st[i] = false;}f[0][0] = 1; //第0列只有竖着摆放一种情况for(int i = 1; i <= m; i ++){for(int j = 0; j < 1 << n; j ++){for(int k = 0; k < 1 << n; k ++){//是否可以从i-1列的第k个状态转移过来if((j & k) == 0 && st[j | k]){f[i][k] += f[i - 1][j];}}}}//第m列全0,就代表0~m-1列已经摆放合法cout << f[m][0] << endl;}return 0;
}

最短Hamilton路径

如果我们依次枚举所有点,时间复杂度为O(n!∗n)O(n!*n)O(n!∗n),因此我们用一个二进制的数来表示所有经过的情况,位数是1代表经过了这个点,我们还需要表示该种情况的终点是那个点,如000111表示经过了0到2号点,但我们并不知道终点是那个点,因此我们用f[i,j]f[i,j]f[i,j]来表示,当前经过了iii个点且终点为jjj最小代价,iii就是我们用来表示所有情况的二进制数。我们要求从0到n−1n -1n−1经过所有点,就代表111...111...111...这个状态且终点为n−1n-1n−1,我们可以思考该状态可以由那种状态转移过来,很显然是011...011...011...这状态,而我们知道011...011...011...这个状态是代表了很多终点不同的路径,我们只要枚举011...011...011...该状态下,以终点kkk结尾的路径再加上kkk到jjj的权重w[k,j]w[k,j]w[k,j],求最小值即可。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;const int N = 20, M = 1 << N;int n;
int w[N][N];
int f[M][N];int main()
{cin >> n;memset(w, 0x3f, sizeof w);for(int i = 0; i < n; i ++)for(int j = 0; j < n; j ++)cin >> w[i][j];memset(f, 0x3f, sizeof f);f[1][0] = 0; //初始时只有0号点for(int i = 0; i < 1 << n; i ++){//枚举当前状态的最后一个点jfor(int j = 0; j < n; j ++){if((i >> j) & 1){// i-(1<<j)是上一个状态,即j位上是0for(int k = 0; k < n; k ++){//枚举到上一个状态的终点k,求最小值if(i - (1 << j) >> k & 1) f[i][j] = min(f[i][j], f[i - (1 << j)][k] + w[k][j]);}}}}cout << f[(1 << n) - 1][n - 1] << endl;return 0;
}

DP——状态压缩dp相关推荐

  1. AcWing 327 玉米田 题解 (动态规划—DP—状态压缩DP)

    原题传送门 #include<bits/stdc++.h>using namespace std;const int N = 14, M = 1 << 12, mod = 1e ...

  2. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  3. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  4. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

  5. hdu1074 状态压缩dp+记录方案

    题意:       给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路:       状态压缩dp,记录方案数的地方 ...

  6. FZU-2218 Simple String Problem(状态压缩DP)

    原题地址: 题意: 给你一个串和两个整数n和k,n表示串的长度,k表示串只有前k个小写字母,问你两个不含相同元素的连续子串的长度的最大乘积. 思路: 状态压缩DP最多16位,第i位的状态表示第i位字母 ...

  7. 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp

    文章目录 题目解答 题目链接 题目解答 分析: 状态压缩dp是用二进制数来表示状态. 数据范围n = 20, 那么状态总量就是2202^{20}220个状态. 可以按照以下思路去思考: 哪些点被用过 ...

  8. 状态压缩DP AcWing算法提高课 (详解)

    基础课的状态压缩点这里 基础课中 蒙德里安的梦想 属于 棋盘式状态压缩dp,最短Hamilton路径 属于 集合状态压缩dp 1064. 小国王(棋盘式/基于连通性) 这种棋盘放置类问题,在没有事先知 ...

  9. hdu 5067(状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...

最新文章

  1. linux内核采取,采用动态加载模块的方式Linux内核编译
  2. 第十五届全国大学生智能汽车竞赛华东区赛程
  3. Java实战equals()与hashCode()
  4. Openstack-mitakaCentos7.2双节点搭建--(一)基础服务搭建
  5. javascript --- 实现Ajax的代码
  6. 【离散数学中的数据结构与算法】五 排列与组合一
  7. 中国军事可穿戴传感器行业市场供需与战略研究报告
  8. Windows游戏编程大师技巧笔记(一些基础)
  9. java的Apollo的功能_Apollo配置中心
  10. 可以插卡的ipad_如何使用Mac或者ipad打电话
  11. 一起谈.NET技术,Microsoft NLayerApp案例理论与实践 - 项目简介与环境搭建
  12. Wireless Network概念解析
  13. 用 QT实现拖放(drag-drop)功能
  14. 以下是一段歌词,请从这段歌词中统计出朋友出现的次数。 这些年一个人,风也过,雨也走,有过泪,有过错, 还记得坚持甚么,真爱过才会懂,会寂寞会回首,终有梦终有你在心中。 朋友一生一起走,那些日子不再
  15. 《HarmonyOS开发 - 小凌派-RK2206开发笔记》第1章 开发环境搭建
  16. 半导体设备英文缩写_涨知识!晶圆制造主要设备一览。
  17. java 程序员发展
  18. mscorsvw.exe
  19. pil库修改图片大小_使用PIL改变图像格式及尺寸
  20. bilibili mac客户端 哔哩哔哩 b站mac客户端

热门文章

  1. c/c++ 一维数组、二维数组作为函数参数、返回值
  2. android logo动画,Android logo与开机动画
  3. Python3 去掉json中带的注释
  4. 探究前端的跑马灯效果是如何用css实现的
  5. matlab指数跟踪优化模型,基于聚类选股的上证50指数跟踪遗传算法优化模型研究...
  6. 大众点评在线笔试题目
  7. 光流传感器 定位精度_【论文精选】基于光流定位的自动路径规划清扫机器人...
  8. python控制苹果手机流量_配置ubunto 流量使用限制 python 实现简单 http server
  9. 图数据结构学习:无向图
  10. 深富策略股票配资方式大盘分析:市场探底回升 权重全天压盘拖累指数