zoukankan      html  css  js  c++  java
  • hdu 2062 Subset sequence

    题目分析

    考虑一个集合 An = { 1, 2, ..., n}。比如,A1={1},A3={1,2,3}。我们称一个非空子集元素的排列为一个子集序列。对所有的子序列按字典顺序排序。你的任务就是给出第m个子序列 

     

    首先我们来看看An一共有多少个子集。

    n=1时,只有{1}一个子集合

    n=2时,就有:
    {1}, {2},
    {1, 2}, {2, 1}
    4个子集合。

    n=3时,有
    {1}, {2}, {3},
    {1, 2}, {1, 3}, {2, 1}, {2, 3}, {3, 1}, {3, 2},
    {1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2}, {3, 2, 1}

    也许你发现规律了。An子集合的个数为:
    C1n·A11 + C2n·A22 + ... + Cnn·Ann
    这个公式是对的。但我们换个角度看。

    n=3时,有
    {1}
    {1, 2}
    {1, 2, 3}
    {1, 3}
    {1, 3, 2}

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

    {3}
    {3, 1}
    {3, 1, 2}
    {3, 2}
    {3, 2, 1}n=3时,有
    {1}
    {1, 2}
    {1, 2, 3}
    {1, 3}
    {1, 3, 2}

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

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

    不难发现,An可以按首数字分成n组,而每组里除了第一项,剩下的就是An-1的子集合了。
    ∴f(n) = n[f(n-1) + 1]
    f(1) = 1

    我们拿测试数据3 10来做个示范,解释一下怎么求解。
    因为n=3,所以开始数组里1、2、3三个数。
    我们知道,n=2时,有4种排列,所以上面n=3可以分成三组,每组5个(加上空集)。
    因此第10个在第二组里。所以第一个是2,把2输出。原来的数组里删除2,变成1、3两个数。然后10 - (2 - 1) * 5 = 5,即它在第2组的第5个。
    减去首个空集合,5 - 1 = 4 ≠ 0,表示2后面还有数字。
    因为A1 = 1是,所以再第2组里又可以分成两组,每组2个(加上空集)。
    所以,4在第2组,剩下的数组中,第二个元素是3,所以输出3。再把数组里的3删除,剩下1一个数。
    然后4 - (2 - 1) * 2 = 2,既它是第2组的第2个。
    减去首个空集,2 - 1 = 1 ≠ 0,表示2后面还有数字。
    按上面的方法继续下去,直到n = 0 或 后面为空集为止。
    最后输出数组里的第1个元素,就得到2 3 1,就是解了。

    从上面的计算可以看出来,本题目的关键是先求的An中每一组的个数g(n)
    不难得出:g(n) = f(n) / n
    ∵f(n) = n[f(n-1) + 1]
    ∴g(n) = n[f(n-1) + 1] / n = f(n-1) + 1
    ∵f(n-1) = (n-1) * g(n-1)
    ∴g(n) = (n-1) * g(n-1) + 1

  • 相关阅读:
    Android中Context具体解释 ---- 你所不知道的Context
    JDK6、Oracle11g、Weblogic10 For Linux64Bit安装部署说明
    matplotlib 可视化 —— 定制 matplotlib
    matplotlib 可视化 —— 移动坐标轴(中心位置)
    matplotlib 可视化 —— 移动坐标轴(中心位置)
    matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
    matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
    指数函数的研究
    指数函数的研究
    指数分布的研究
  • 原文地址:https://www.cnblogs.com/unknownname/p/9615149.html
Copyright © 2011-2022 走看看