计数 组合数学动态规划总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计数 组合数学动态规划总结相关的知识,希望对你有一定的参考价值。

本文持续更新

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

 

1 划分数

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

  思路:

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

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

 

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)。

 

 

更新中…………

以上是关于计数 组合数学动态规划总结的主要内容,如果未能解决你的问题,请参考以下文章

leetcode动态规划题组笔记以及总结(持续更新)

经典动态规划总结

零基础理解动态规划(DP) - 开篇 - 01

动态规划习题本(持续更新)

动态规划习题本(持续更新)

动态规划习题本(持续更新)