zoukankan      html  css  js  c++  java
  • 状压DP初探·总结

    2018过农历新年这几天,学了一下状态压缩动态规划,现在先总结一下。

     

    状态压缩其实是一种并没有改变dp本质的优化方法,阶段还是要照分,状态还是老样子,决策依旧要做,转移方程还是得列,最优还是最优,无后还是无后,所以它比较好理解。

     

    状压,顾名思义就是要将一些状压想办法压缩起来(可以压,也可以删)。其中这些状态都满足相似性和数量很多。这样才好压而且压得有意义。常见于一般的方格题,网络题等等。

     

    所以一般基础的状压就是将一行的状态压成一个数,这个数的二进制形式反映了这一行的情况。所以位运算可以帮助我们解决很多问题。我看了一篇讲义,感觉挺好的,就直接拿来用了,这里会介绍二进制的基本操作和一些常见用法。

     

    这些操作都是在一个数转成二进制的情况下做的,包括按位与&、或|、取反~(注意负数补码的符号)、异或^(不同则真)、左移<<、右移>>。

     

    下面是由江苏省淮阴中学薛志坚整理的一些常见操作:

     

    接下来就是进行普通dp的操作。

     

    不过这里要注意几点

     

    初试化状态的时候要看清条件,什么要,什么不要。

     

    一般情况下要预处理前k行(k由题目定)。

     

    Dp时题目给的条件和fit函数、state数组都要检查。

     

    最最重要的一点:位反(~ )  >  算术  >  位左移、位右移  >  关系运算

    >  位与  >  位或  >  位异或  >  逻辑运算

    所以一般位运算最好打括号。

     

     

    讲讲不常规的状压dp。

     

    我们要找一个方法将多余的状态给砍掉或者缩成一段。

     

     

     

    上例题:

     

     

    1、Corn Fields

     

    最基础的状压dp,很多时候可以用来作为模板借鉴着做其他题目。

     

    详情请看:这里

     

     

    2、互不侵犯King

     

    好像是优化搜索,其实还是dp,不过这里比t1的条件多了、难了,也比t1多限定了一个国王数量,所以要多存一个国王数量的状态,但是其实还是很基础。

     

    详情请看:这里

     

     

    3、炮兵阵地

     

    这里从一个单行状态变成了双行状态,其他都很模板。

     

    详情请看:这里

     

     

    4、过河

     

    这是第一道升级的状压,它终于不是普通01串的状态,而是将没用的状态给直接砍掉,再进行dp

     

    详情请看:这里

     

     

    5、强迫症的炸山

     

    这是我同学(一位大佬)lxy出的题,这道看似很简短、很简单的题,做起来却不是那么容易。我甚至还没找到怎么正确地压缩状态。至今未果,以后会慢慢补充。毕竟现在打暴力得了tle,打正解(手动划去)得了re,我也很无奈。

     

     

    状压dp其实不止这么简单,我这次学了只是皮毛中的皮毛,状压要捉住怎么压缩状态,加快程序运行,别的就和普通dp一样了。

     

    请各位大佬指出错误或补充,谢谢。

     

    嗯,就这样了。

  • 相关阅读:
    [原]将Oracle 中的blob导出到文件中
    [原]unique index和non unique index的区别
    lsattr/chattr
    [原]说不清楚是Oracle的Bug还是TSM的Bug
    [摘]Oracle限制某个数据库帐号只能在特定机器上连入数据库
    [原]复制Oracle Home所需要注意的几个问题
    [原]Oracle Data Guard 折腾记(二)
    配置vsFTP的虚拟用户认证
    [原]给Oracle 11g Interval分区进行重命名
    [摘]如何抓住蝴蝶效应中的那只蝴蝶
  • 原文地址:https://www.cnblogs.com/Ronald-MOK1426/p/8456945.html
Copyright © 2011-2022 走看看