• 计数 组合数学总结


    本文持续更新

    对计数,组合数学DP作总结,给出思路,状态转移方程,略去代码,状态初始值等。

    1 划分数

      (1)m个不可区分的物品分成n份,每份的数量大于等于0,求划分的方法数。

      思路:

      1)若m < n, 则等价于m个物品划分为m份。

      2)否则,若至少存在1份数量为0,则相当于m个物品划分为n - 1份;若每份数量大于等于1,则相当于m - n个物品划分为n份。动态规划或记忆化搜索。

      (2)整数划分

      n=x1 + x2 + ... + xi (1 <= xi <= n),则{x1, x2, ..., xi}为n的一个划分。

      如果{x1, x2, ..., xi}中的最大值小于等于m,则为n的m划分,记n的m划分的个数为f(n,m)

      求f(n, m)方法:

      1)n = 1 或m = 1,则f(n, m) = 1

      2)n < m,f(n, m ) = f(n, n)

      3)n = m,f(n, m ) = f(n, n - 1) + 1

      4)否则,f(n, m) = f(n - m, m) + f(n ,m - 1)

    2 HDU1502 Regular Words

      给定n,求n个A,n个B,n个C组成的串的任意前缀中A的数量大于等于B的数量,B的数量大于等于C的数量的方法数,类似于卡特兰数。

      dp[i][j][k]表示A, B, C分别i, j, k个时的方法数,则:

      dp[i][j][k] = dp[i - 1][j][k] + dp[i][j - 1][k] + dp[i][j][k - 1](i >= j >= k)

    3 HDU1133 Buy the Ticket

      m个人手持50元,n个人手持100元,买50元一张的票,售票员开始无零钱,求可行的排队方法数。

      

    方法1:

      抽象为m个1,n个-1的序列,前k(k <= m + n)项和大于等于0的方法数乘以m! * n!。

      dp[i][j]表示m个1,n个-1的序列,前k(k <= m + n)项和大于等于0的方法数,则:

      dp[i][j] = dp[i - 1][j] + dp[i][j - 1](i >= j)

    方法2:

      思路来自:http://www.cppblog.com/MiYu/archive/2010/08/08/122676.html,并给出证明

      m个1,n个-1的序列,前k(k <= m + n)项和大于等于0的方法数等于C(m+n, n) - C(m+n, m+1),证明如下:

      A为m个1,n个-1且不符合条件的序列数集合,B为m + 1个1,n - 1个-1的任意序列数集合。

      (1)将A中任意序列的第一个不符合条件的-1变为1,可得到B中一元素,且A中不同元素得到B中不同元素,故A包含于B

      (2)将B中任意序列的第一个1变为-1,可得到A中一元素,且B中不同元素得到A中不同元素,故B包含于A

      综上,集合A,B大小相等。故m个1,n个-1且不符合条件的序列数个数为C(m+n, m+1)。又任意序列方法数为C(m+n, n),故符合条件的为C(m+n, n) - C(m+n, m+1)。

    4 可重组合

      每个数可以选多次,从n个数中选k个数的方法数:

      相当于方程x1 + x2 + ... + xn = k有多少组非负整数解。其中xi表示第i个数被选了多少次。引入辅助变量yi = xi + 1,则y1 + y2 + ...+ yn = n + k。问题转化为求此方程的正整数解的个数。故方法数为C(n + k - 1, n - 1).

      一棵树有n种形态,m棵不考虑顺序则有C(n + m  - 1, m)种形态(HDU1294 Rooted Trees Problem)

      

    5 有重复的组合数

    POJ1285 Combinations, Once Again

    n种物品,每种num[i]个,求取r个的方法数。

    背包思想,f[j]表示当前取j个数的方法数,则状态转移方程为:

    f[j] += f[k](max(j - num[i], 0) <= k < j)

    外层循环枚举物品,内层循环从大到小枚举空间,最内层枚举方法数。

    6 全错位排列

    n个数(1 <= i <= n),任意数i不能排在第i位,求方法数。

    1)容斥原理:

    n! - C(n , 1) * (n - 1)! +  C(n , 2) * (n - 2)! -...... = n!(1/2! - 1/3! + ... + (-1)^n * 1/n!) 

     2)递推公式:

    f(1) = 0, f(2) = 1

    f(n) = (n - 1) * (f(n - 1) + f(n - 2)) 

     3)另一公式

    简化后的公式是f(n) = [n!/e+0.5] (向下取整)

     应用:HDU3010 N Knight

    偏序集 Dilworth定理

    链:若偏序集<X, ≤>中的任意元素均可比较,称之为链。
    反链:若偏序集<X, ≤>中的任意两元素均不可比较,称之为反链。
     
    定理1:令<X, ≤>是一个有限偏序集,而设r是其最大链的大小。则X可以被划分成r个且不能更少的反链。
     
    其对偶定理称为Dilworth定理:
    定理2:令<X, ≤>是一个有限偏序集,并令m是反链的最大大小。则X可以被划分成m个但不能再少的链。
     

    参考:《组合数学》

    8 棋盘的完美覆盖

    m * n的棋盘可以用1 * b的格牌覆盖当且仅当b是m或者n的一个因子

    更新中…………

  • 相关阅读:
    Golang 读写文件的操作
    初始 Elasticsearch
    数据存储单位的换算(bytes、KB MB GB TB PB EB ZB YB DB NB)
    Go 语言类型元信息的通用结构 _type
    空接口
    HashMap和Hashtable的区别
    谈谈final, finally, finalize的区别
    理解AOP
    Struts2 OGNL概述
    Struts2原理
  • 原文地址:https://www.cnblogs.com/IMGavin/p/5621370.html
Copyright © 2020-2023  润新知