状压dp做题笔记

CodeChef Factorial to Square (分块决策)

Description

给定一个n,要求在[1,n]中删除一些数,并使剩下的数的乘积是一个完全平方数,同时要求乘积最大,求删除方案数.
\(n\leq 3000\)

Solution

  • 首先要构造出最优解,考虑把所有数相乘,发现如果某个质因数出现的奇数次,那就必须要删掉一个.那么只用在[1,n]中把该质数删除即可,得到的就是乘积最大的完全平方数.

  • 现在考虑构造方案. 要求被删除的数包含所有必删质因数,并且只能出现一次. 那么就可以抽象成一个01串.

  • 现在把质因数分类处理,\(<\sqrt{n}\)的为一块,发现这样的质数只有13个,将这些数状压.

  • 剩下的数就暴力枚举,对于一个质因数\(x\geq\sqrt{n}\),他的倍数不会超过\(\sqrt{n}\)个,那么对于每个x,枚举它的倍数做一次背包,同时预处理剩下的数的合法情况,进行转移,复杂度为\(O(n*2^{13})\).

CodeChef Organize The Wallet (dp构造与转移)

Description

一共有7种面值的纸币,现在给定一个长度为n的纸币排列序列,要求进行一些插入操作,使得序列每种面值都是排列在一起的.求最小移动步数.
\(n\leq 100000\)

Solution

  • 插入操作的性质:如果把一张纸币拿出来,那么可以把它放到任意位置.
  • 可以考虑枚举放置顺序
    1. 如果在当前状态要放的纸币种类和当前位置的纸币种类不同,那就一定要把这个纸币抽走.
    2. 如果相同,那就不移动
    3. 如果该数应该出现在前面,那就插入到前面.
  • 转移方程大概为:
    1. \(chkmin(dp[i][j][k],dp[i-1][j][k]) (Col[i]=k)\)
    2. \(chkmin(dp[i][j][k],dp[i-1][j][k]+1) (Col[i]!=k,Col[i]\in j)\)
    3. \(chkmin(dp[i][j|Col[i]][Col[i]],dp[i-1][j][k]) (Col[i]\notin j)\)
    4. \(chkmin(dp[i][j][k],dp[i-1][j][k]+1)(Col[i]\notin j)\)
posted @ 2018-09-18 16:35  Zerokei  阅读(184)  评论(0编辑  收藏  举报