zoukankan      html  css  js  c++  java
  • 状压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)\)
  • 相关阅读:
    windows 共享文件夹 给 mac
    给mac配置adb 路径
    关于android 加载https网页的问题
    http tcp udp ip 间的关系
    手机服务器微架构设计和实现专题
    添加ssh key
    本人对于线程池的理解和实践
    使用Android Butterknife
    记一次失败的笔试(华为研发工程师-汽水瓶笔试题)
    简易坦克大战python版
  • 原文地址:https://www.cnblogs.com/Zerokei/p/9669741.html
Copyright © 2011-2022 走看看