比赛的时候刷出来的第一个状态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的更多相关文章

  1. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  2. HDU 3605:Escape(最大流+状态压缩)

    http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ...

  3. [HDU 4336] Card Collector (状态压缩概率dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意:有n种卡片,需要吃零食收集,打开零食,出现第i种卡片的概率是p[i],也有可能不出现卡 ...

  4. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

  5. codeforces B - Preparing Olympiad(dfs或者状态压缩枚举)

    B. Preparing Olympiad You have n problems. You have estimated the difficulty of the i-th one as inte ...

  6. NOIP2005过河[DP 状态压缩]

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  7. vijos1426兴奋剂检查(多维费用的背包问题+状态压缩+hash)

    背景 北京奥运会开幕了,这是中国人的骄傲和自豪,中国健儿在运动场上已经创造了一个又一个辉煌,super pig也不例外……………… 描述 虽然兴奋剂是奥运会及其他重要比赛的禁药,是禁止服用的.但是运动 ...

  8. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  9. poj3254 状态压缩dp

    题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法.     分析:假如我们知道第 i-1 行的所有的可以放的情况,那么对于 ...

随机推荐

  1. 13、Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  2. 白话控制反转IoC及其应用

    控制反转(IoC, Inversion of Control),依赖注入(DI, Dependency Injection)是在面向对象编程中经常碰到的专业术语.很多朋友可能在百度之后,便浅尝辄止,没 ...

  3. define的误用

    #define LIGHT_SPEED 3e8 // m/sec (in a vacuum)

  4. Qt-网络与通信-获取本机网络信息

    在网络应用中,经常需要获取本机主机名和IP地址和硬件地址等信息.运用QHostInfo.QNetworkInterface.QNetworkAddressEntry可以获得本机的网络信息. 上运行截图 ...

  5. Qt-第一个QML程序-1-项目工程的建立

    这个小程序是我发的第一个完整的QMl程序,这个程序也会持续的更新,一步一步的完善起来,最后会有一个什么样的结果也是不知道,只是把自己目前掌握的QML相关的东西都慢慢的写进来,积累起来 先展示一下运行结 ...

  6. 【带 josn参数的测法】

    遇到json 参数的情况这样写  ,否则就会报错 cod 415   nocookie post请求 ,","email":"beihe@163.com&quo ...

  7. MD5接口解密操作_接口签名校验

    很多HTTP接口在传参时,需要先对接口的参数进行数据签名加密如以下POST接口 http://localhost:8080/pinter/com/userInfo 参数为{"phoneNum ...

  8. java 流 文件 IO

    Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类 ...

  9. 讯飞云 API 语音听写 python3 调用例程

    #!/usr/bin/python3 # -*- coding: UTF-8 -*- import requests import time import gzip import urllib imp ...

  10. 【转载】JAVA常见面试题及解答(精华)

     JAVA常见面试题及解答(精华)       1)transient和volatile是java关键字吗?(瞬联) 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: ...