• [学习笔记]递推问题选讲


    Hanoi塔问题

    要将a上所有圆盘移到c,并且过程中不能出现大的圆盘在小的圆盘上面的情况.

    1. 把除了最大的之外的圆盘从a移到b. f[n-1]
    2. 把最大的从a移到c. 1
    3. 把除了最大的之外的圆盘从b移到c. f[n-1]

    通式:\(f[n]=f[n-1]\times2+1\)

    Catalan数

    求用对角线将n边形划分成(n-2)个三角形的不同的方案数.

    • 因为n边形每条边都必在一个三角形中,所以任取一条边为底,枚举顶点,将n边形分成两个多边形(k边形 和 n-k+1边形),个数为f[k]×f[n-k+1],然后将所有情况相加即可.

    通式:\(f[n]=\sum_{i=2}^{n-1}f[i]\times f[n-i+1]\).

    第二类Stirling数

    n个不同的球,放入m个无区别的盒子,不允许盒子为空。

    1. 第n个球单独放一个盒子,共有m个盒子 f(n-1,m-1)
    2. 第n个球和其他球放一起,共有m个盒子 f(n-1,m)×m

    通式:\(S(n,m)=S(n-1,m-1)+S(n-1,m)\times m\)

    扩展

    n个不同的球,放入m个有区别的盒子,不允许盒子为空。

    此时箱子顺序便与方案数有关,\(f(n,m)=P_m^m\times S(n,m)\)

    \(\\\)

    n个不同的球,放入m个无区别的盒子,允许盒子为空。

    枚举非空盒子数,\(f(n,m)=\sum_{i=0}^m S(n,m)\)

    \(\\\)

    n个不同的球,放入m个有区别的盒子,允许盒子为空。

    结合上面两种情况,\(f(n,m)=\sum_{i=0}^m p_m^i\times S(n,m)\)

    \(\\\)

    n个相同的球,放入m个有区别的盒子,不允许盒子为空。

    隔板法:m个盒子=(m-1)块版,n个球且盒子不为空=(n-1)个槽,每个槽最多放一块板,所以方案数为 \(C_{n-1}^{m-1}\).

    \(\\\)

    n个相同的球,放入m个有区别的盒子,允许盒子为空。

    可以假设m个盒子中原来各有一个球,现在需要再放入n个球,问题就转化成了上一种情况:m个盒子=(m-1)块版,(n+m)个球且盒子不为空=(n+m-1)个槽,每个槽最多放一块板,所以方案数为 \(C_{n-1}^{n+m-1}\).

    \(\\\)

    n个相同的球,放入m个无区别的盒子,允许盒子为空。

    \(f[i][j]\)表示n个球,m个盒子的方案数.

    因为盒子相同,为避免计重,给每个盒子编号,假设每个盒子里的小球数不上升.

    所以可将加球操作分为两种:

    • 新添一个盒子
    • 往所有盒子里放入一个球

    \(f[n][m]=\begin{cases}f[n][m-1]+f[n-m][m]&n\geq m\\f[n][m-1]&n<m\end{cases}\)

    \(\\\)

    n个相同的球,放入m个无区别的盒子,不允许盒子为空。
    假设每个盒子里的小球数不上升.

    因为不允许盒子为空,所以可往每个盒子中先放入一个球,问题就转化成了上一种情况:(n-m)个相同的球,放入m个无区别的盒子,允许盒子为空.

    2017-06-28 21:22:55

  • 相关阅读:
    踩踩踩
    c语言可变参
    C++开发者都应该使用的10个C++11特性
    c++11 条件变量 生产者-消费者 并发线程
    c++11 线程
    C++ 虚函数表解析 继承
    坐标系
    C++ 容器:顺序性容器、关联式容器和容器适配器
    全面深入介绍C++字符串:string类
    做一个懒COCOS2D-X程序猿(一)停止手打所有cpp文件到android.mk
  • 原文地址:https://www.cnblogs.com/AireenYe/p/15602524.html
Copyright © 2020-2023  润新知