【总结】状压DP

来源:互联网 发布:推荐算法的评价指标 编辑:程序博客网 时间:2024/06/11 02:06

对于状压DP的理解和总结

  • 一般来说,状压是把多种状态(方案,集合等等)hash进二进制数中,0表示该状态不存在,1表示该状态存在(也有用三进制等等,如算路径一点可经过2次),所以首先应掌握位运算。应注意位运算的优先级比较低,如减法比左移优先,如果不确定表达式的计算顺序,应多用括号。
  • 到目前为止做到的状压大致是棋盘模型,TSP问题和覆盖模型,但是DP中状态种类<=20的应该都可以考虑状压。
  • DP中的状态有的可以直接表示,有的要用dfs,bfs等等先处理出来,状压DP除了要压状态外其实和普通DP一样,所以关键还是转移方程,一定要多思多练。
  • 有一点觉得老师的课件说得很好就是状压的动机,其实就是因为转移时比较粗糙的状态行不通,所以要细化状态,为了节省时间空间就选择状压DP。
  • 状压DP可以用记忆化搜索实现,这是由于搜索和DP的相似性(都具有状态和转移)。
  • 状压还有一重要的拓宽——插头DP,还没有学习,等学了再po出来。
  • 推荐大家去看书!比如《算法竞赛入门经典》。我刚刚看书,发现有一点自己没有做到→在一些结果与转移顺序无关的题目中,如转移方程:d(S) = min{|P[i]P[j]| + d(S - {i} - {j})}大部分人都是用i, j∈S;但是其实可以把集合中的最大元素或最小元素作为i,即i=max{S}, j∈S,这样做可以减少决策,降低时间复杂度。
  • 还有一个关键。。就是看到一个题目,要去用动规的思想想想能不能解题23333

大概就是以上理解吧,其实状压和DP如果想到转移方程就很简单了~
小伙伴们都要加油哇~~~相信自己 我们同在!mua~ =3=

原创粉丝点击