状态压缩---UVA6625 - Diagrams & Tableaux
比赛的时候刷出来的第一个状态DP。(期间有点没有把握是状态DP呢。)
题意:题意还是简单的。K行的方格。之后输入L1~LK 代表每一行方格数。在这些往左紧挨的方格子里填上1~N的数字。
其中右边格子的数值会大于等于左边的格子,下边的格子的数值会大于上边的格子。
其中观察一列的数值。会发现一列的数值均是不一样的。而且 N<=7。也就是说我们让1~N的数字填到第一列上。那我们可以按列来进来状态压缩。也就是认为一列就是一个状态。
也就是我们让:
数值 7 6 5 4 3 2 1
二进制0 0 0 0 0 0 0
对应起来。0代表不存在 1代表存在。
这里有一个注意点:状态压缩并不能表示出状态内部元素的大小关系的。只能表示这个元素有与无。那么想处理下一个元素(方格的值)比上一个元素大,该如何是好?
比赛的时候思维混乱,在那里考虑能不能预处理这样的合法状态。但是明显没意义的,因为二进制只能表示有和无啊。完全不可能表示出内部元素大小关系的啊。
其实只要直接默认它已经存在这样的关系即可。(其实本来就该如此)。
比如: 1 1 1 1 1 1 1 1 (7个1) PS:这个数据并不大。而且这也是状态压缩的一个特点。20个元素(我喜欢把状态里面的各个数值叫做元素)还是可以接受的放进下标中。更何况就7个。
这个状态就表示这一列的排列顺序是 1 2 3 4 5 6 7 (从上到下)。
又比如: 1 0 1 0 1 1 1 代表从上到下的顺序是 1 2 3 5 7
接下来是后一列和前一列对应的元素大小比较 下后一列>=前一列。
我的处理方式是把后一列的状态一一提取元素和前一列的对应元素来比较。
提取元素的方法不多说。
设后列的状态是 i
那么对应元素就是 i&(-i) 。每一次比较之后 i -= i&(-i).
编程之美上面是 i &= (i-1) 来删除 最后一位的1。说真的也很美。题外话。具体数学上。第一章对这个二进制的处理也真的是美爆了。
并且在这个时候 统计当前层的元素个数。元素个数(1的个数)如果大于当前列的方格子数当然是非法的状态啦。就不能转移上来了。
接下来就是码状态压缩了。
个人思考步骤:
1:处理出每一列的合法状态 (这个题目就是一个循环 1 ~ 1<<N-1 即可)
2:思考状态所需要记录的信息。前后列状态转移(感觉可以滚动数组啊。但是列数不多,而且现在我技术还是比较有限的)。所以抽象出dp[i][j] 第i列的j状态。为了后列能根据前列的信息得出而已。
3:初始化。也就是对第一列做初始化。
4:循环层数。 这里有3层 一层是列。一层是当前层的状态 。再一层是当前层的上一层的状态。(如果题目和上上层也有关系的话。那就再多一层循环。反正我们状态的信息都记录进了dp[i][j]里了。循环是在使用它们)。
这是我当前的能力所能达到的理解。
思考上的小bug:
1:会觉得 1~1<<N-1 里面还有很多的非法状态啊。比如说 k=3 那么 1~1<<N-1 只有二进制的数字 1的数目为3的是合法的。可是我在写循环的时候上一层的状态。我都是直接从 1~1<<N-1 这种写法。那非法状态不也是转移上来了?
其实看似转移上来了。其实不然。我们并不需要煞费苦心还要对上一层的状态进行统计1 然后排除非法之类的。因为非法的状态。即使转移上来 也是0 也就是说它对当前状态是不会有贡献的。这也是经典背包问题上满包为何要把值弄成-INF的原因。
这里的-INF 要看情况的。比如概率运算的话 。如果你弄成 -无穷大 那是会出现错误的。因为有乘积。
状态压缩题目的特点:
1:数值上会微妙得比较少。而且这个数值往往会只能出现一次。而且是根据出现与否就可以确定序列式如何的。 如果说这个题目改一改。变成一列上的数字要不同。那么 我们 0000111 可以表示是 1 2 3 或者是 3 2 1 或者是 2 1 3。反而导致我们无法使用状态压缩。而这种严格递增递减的序列恰恰是壮压发挥的好场所 (我们需要对题设敏感)而且求方案数是个老问题了。
比赛的时候第一次实践了状压开心不已。但是后来竟然被别人用搜索加剪枝给过了。
后来思考了一下:搜索应该可以这样考虑。就是右边的话 有 当前数值~N 个方向。向下的话有 当前数值+1 ~ N个方向。最后能把整个图给走满 就方案数+1。只能说他们的搜索太扎实了。。或者说我该考虑一下这种抽象的搜索。
状态压缩---UVA6625 - Diagrams & Tableaux的更多相关文章
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- HDU 3605:Escape(最大流+状态压缩)
http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ...
- [HDU 4336] Card Collector (状态压缩概率dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意:有n种卡片,需要吃零食收集,打开零食,出现第i种卡片的概率是p[i],也有可能不出现卡 ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
- codeforces B - Preparing Olympiad(dfs或者状态压缩枚举)
B. Preparing Olympiad You have n problems. You have estimated the difficulty of the i-th one as inte ...
- NOIP2005过河[DP 状态压缩]
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- vijos1426兴奋剂检查(多维费用的背包问题+状态压缩+hash)
背景 北京奥运会开幕了,这是中国人的骄傲和自豪,中国健儿在运动场上已经创造了一个又一个辉煌,super pig也不例外……………… 描述 虽然兴奋剂是奥运会及其他重要比赛的禁药,是禁止服用的.但是运动 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- poj3254 状态压缩dp
题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法. 分析:假如我们知道第 i-1 行的所有的可以放的情况,那么对于 ...
随机推荐
- OpenCV代码提取:dft函数的实现
The Fourier Transform will decompose an image into its sinus and cosines components. In other words, ...
- Java:String、StringBuffer、StringBuilder
一.String 1. String类是final类,意味着String类不能被继承,它的成员方法都默认为final方法.在早期的JVM版本中,被final修饰的方法会转为内嵌调用来提升执行效率.从J ...
- spring源码-BeanPostProcessor-3.3
一.BeanPostProcessor这个是spring容器的拓展之一,是用于获取bean的时候处理对应的对象: 二.常用场景,在获取bean的时候,重新初始化bean的属性等. 三.实现方式(加入容 ...
- 关于iOS开发的各种证书
关于iOS开发的各种证书 最近在接推送服务的时候,被各种证书弄得不亦晕乎,这里记录一下一些基本的证书作用: 1. App IDs appID分明确的和通配的两种,如果要使用推送功能,只能用明确的. 2 ...
- Python学习-猜数字游戏
菩萨蛮·黄鹤楼 茫茫九派流中国,沉沉一线穿南北.烟雨莽苍苍,龟蛇锁大江. 黄鹤知何去,剩有游人处.把酒酹滔滔,心潮逐浪高! --coding:UTF-8-- import random secret ...
- 天平 (Not so Mobile UVA - 839)
题目描述: 题目思路: 1.DFS建树 2.只有每个树的左右子树都平衡整颗树才平衡 #include <iostream> using namespace std; bool solve( ...
- [Clr via C#读书笔记]Cp9参数
Cp9参数 可选参数和命名参数 参数设置了默认值(设置要从右到左,有默认值的参数必须放在没有默认值的参数的后面,默认值必须是常量),就可以使用可选参数和命名参数了.向方法传递实参的时候,编译器按照从左 ...
- 关于wcf服务编译平台是x86, 运行平台是x64时,如何调试
关于调试CTDC项目中的的 wcf服务时注意事项: 因为wcf项目引用的的 x86的程序集,所以wcf生成的目标平台为x86.故在64系统上调试需要执行下面的脚本 具体操作步骤: 1. 必须使用201 ...
- lsscsi命令详解
基础命令学习目录首页 lsscsi包默认是不安装的.lsscsi包安装完之后,lsscsi命令就可以使用了.lsscsi命令(lsscsi -t -L)能很方便的看出哪些是固态硬盘(SSD),哪些是S ...
- 2.重新安装CM服务
步骤1.停止CM服务2.删除CM服务3.添加CM服务4.测试数据库 步骤 1.停止CM服务 2.删除CM服务 没有发现可以单独删除某一项CM服务,必须全部删除 3.添加CM服务 4.测试数据库 如果报 ...