以下内容主要是对:
http://www.cnblogs.com/kliner/archive/2012/10/12/CS_PC.html
所做学习笔记。
一、插板法:
引:在n个不同元素中有重复取k个的组合数?
析:原命题<=>x1+x2+x3……xn=k的自然数解数
<=>x1+x2+x3……xn=n+k的非负整数解数
<=>n+k个球放入n个不同盒子中,每份不能为空,分法?
插空法?===>插板法!
n+k个相同元素排列数为1,其中形成n+k-1个空,分成n份,即等价于在n+k-1个空中插入n-1个隔板:
=C(n+k-1,n-1)=C(n+k-1,k)
二、变式->第二类斯特林数。
问:n个不同的球,分成m份?
析:考虑DP。
拿出最后一个球,分类:
①让前n-1个放入前m-1份中,让第n个单独放在第m个中;
②对于前n-1个放入m份中的每一种放法,第n个都有m种放法。
f[n][m]=f[n-1][m-1]+f[n-1][m]*m;
重复?
球不同,不允许为空->不会重复。
三、变式->允许为空?
析:直接递推可能无法避免重复的情况。
转化?
设g[n][m]=f[n][1]+f[n][2]+f[n][3]……f[n][m]
四、相同球放到m个盒子,不允许为空?
数的划分?!
分类?
n个球放入m个盒子的方法来自——
①n-1个球放入m-1个盒子,然后再把一个球放到一个盒子里;
②将n-m个球放入m个盒子,然后再每个盒子放一个球。
条件:互为补集,没有遗漏!
五、练:(POJ2229)相同球放到若干个盒子中,每个盒子的球的个数必为2的x次幂。
范围:n∈N∩[1,10^6]
析:二进制分解->完全背包?O(nlogn)
O(n)做法?
奇怪的数的划分?
f[2*n-1]=f[2*n]!奇数的分法必等于偶数,即对于偶数的每种分法加一个盒子放一个新球。
那偶数呢?
分类?
n个球放入若干个盒子的方法来自——
①将n-1=n-2个球放入若干个盒子,然后再把1个球放到一个盒子里。
②将n/2个球放入若干个盒子,然后再把每个盒子的球数*2。
条件:不重不漏,互为补集。
总结:DP思路?
将当前量分类,在已知中寻找与当前量值的关系,保证不重不漏。
http://www.cnblogs.com/kliner/archive/2012/10/12/CS_PC.html
所做学习笔记。
一、插板法:
引:在n个不同元素中有重复取k个的组合数?
析:原命题<=>x1+x2+x3……xn=k的自然数解数
<=>x1+x2+x3……xn=n+k的非负整数解数
<=>n+k个球放入n个不同盒子中,每份不能为空,分法?
插空法?===>插板法!
n+k个相同元素排列数为1,其中形成n+k-1个空,分成n份,即等价于在n+k-1个空中插入n-1个隔板:
=C(n+k-1,n-1)=C(n+k-1,k)
二、变式->第二类斯特林数。
问:n个不同的球,分成m份?
析:考虑DP。
拿出最后一个球,分类:
①让前n-1个放入前m-1份中,让第n个单独放在第m个中;
②对于前n-1个放入m份中的每一种放法,第n个都有m种放法。
f[n][m]=f[n-1][m-1]+f[n-1][m]*m;
重复?
球不同,不允许为空->不会重复。
三、变式->允许为空?
析:直接递推可能无法避免重复的情况。
转化?
设g[n][m]=f[n][1]+f[n][2]+f[n][3]……f[n][m]
四、相同球放到m个盒子,不允许为空?
数的划分?!
分类?
n个球放入m个盒子的方法来自——
①n-1个球放入m-1个盒子,然后再把一个球放到一个盒子里;
②将n-m个球放入m个盒子,然后再每个盒子放一个球。
条件:互为补集,没有遗漏!
五、练:(POJ2229)相同球放到若干个盒子中,每个盒子的球的个数必为2的x次幂。
范围:n∈N∩[1,10^6]
析:二进制分解->完全背包?O(nlogn)
O(n)做法?
奇怪的数的划分?
f[2*n-1]=f[2*n]!奇数的分法必等于偶数,即对于偶数的每种分法加一个盒子放一个新球。
那偶数呢?
分类?
n个球放入若干个盒子的方法来自——
①将n-1=n-2个球放入若干个盒子,然后再把1个球放到一个盒子里。
②将n/2个球放入若干个盒子,然后再把每个盒子的球数*2。
条件:不重不漏,互为补集。
总结:DP思路?
将当前量分类,在已知中寻找与当前量值的关系,保证不重不漏。