Skip to content

非常有趣的一题!

题意理解

扯了三段高大上的符号表示其实就是要把一个大的 n 个元素的集合不重不漏的分成 m 个子集


然后比较有趣的是这题被放在递归题单里了,这是为什么呢?

举例

这题举 n3 的例子没有什么代表性,因为就算举了也看不出来这要什么递归 所以举最小规模的 n=4 非常不错

{{1,2},{3,4}},{{1,3},{2,4}},{{1,4},{2,3}},{{1,2,3},{4}},{{1,2,4},{3}},{{1,3,4},{2}},{{2,3,4},{1}},

看一看,对一个大集合拆子集有两种思路:

  1. 拎出一个元素,将剩余 n1 个元素拆分成 m1 个集合
  2. n1 个元素拆成 m 个子集,然后把多出来的一个元素放进 m 个子集中的任意一个中 得到状态转移方程:
dp(n,m)=dp(n1,m1)+m×dp(n1,m)

基本条件

  1. n=0 或者 m=0,一种都没有
  2. n=m,一种
  3. m>n,一种都没有
  4. m=1n=1,一种(当然这种要排除另一个等于 0 的情况,所以判断顺序不能错)

到底怎么想呢

大集合拆小集合,肯定要往小里拆,但显然不可能一下子处理 1n 的所有情况,所以想到去处理 n1 的时候的情况问题转化成了一个 n 集合怎么由一个 n1 集合推出来,或者是推回去。 为什么不是 n2?因为 n1 会推到这里的。 那么再想一下,n1 个元素状态下 m 要满足什么条件呢?这里的切入点可以考虑剩下来的那一个元素,也就是从 n1 转到 n 的时候这一个元素怎么处理,那么才是理所当然的想到前面那两种,要么放到前面已有的集合去,要么单独一个集合,进而得出状态转移方程。


后记

上面的四种基本条件有些不会遇到,根据状态转移方程可知 k1 的速度显然更快,因此只要卡 k=1 的状态就行,以及题目给了条件 nk 因此可以丢掉 1、3、4(2)的情况判断。