繁体   English   中英

组合:尝试计算算法(关于子集)

[英]Combinatorics: Trying to figure algorithm (about subsets)

我正在尝试解决TopCoder上的问题。 基本上我需要的是以下算法:

令S = [1,2,...,n]为序列。 令m小于n。

1)找到大小为m的S的所有子序列(这很容易-n ^ m)。

2)找到大小为m的S的所有子序列,其中元素按降序排列。

3)找到大小为m的S的所有子序列,其中不允许重复元素(这也很容易-(n!)/((nm)!)。

4)找到大小为m的S的所有子序列,这些元素的顺序为非递减且不允许重复。

仍在尝试寻找第2部分和第4部分的公式。将提供一点帮助。

提前致谢。

编辑:

原始问题:

https://docs.google.com/document/d/1X1VK8Vq2DlqMbZpXHGLoWv9ULfRLVoLtMTRRU5nh5qs/edit?usp=sharing

解决4),请注意,不重复“不减少”表示“增加”。 将由S构建的长度为m的所有长度序列的集合划分为没有重复元素的等价类,该等价类由子序列中出现的元素集合定义。 在每个等价类中,只有一个递增的序列(元素按<排序)。 每个等价类的大小是元素的排列数量。 因此4)序列的数量为(n!)/((nm)! * m!) = n \\choose m

ad 2),将序列建模为S所有元素的出现次数序列(包括0表示不包含在内)。 这可以写成成对的序列(s_i, k_i), i=1..n; s_i \\in S, k_i \\in IN, \\foreach p,q in {1..n}, p!=q: s_p != s_q (s_i, k_i), i=1..n; s_i \\in S, k_i \\in IN, \\foreach p,q in {1..n}, p!=q: s_p != s_q长度为n (s_i, k_i), i=1..n; s_i \\in S, k_i \\in IN, \\foreach p,q in {1..n}, p!=q: s_p != s_q “不减少”表示通过根据增加s_i排列元素而给出的序列的唯一允许排序。 因此,唯一的自由度是必须遵守求和为m的约束的出现次数: sum_{i=1..n} k_i = m

此问题等效于具有(特定)限制并计算晶格路径的分区。 我不认为满足这种条件的IN^n的n元组的数量没有封闭的公式。

但是,有一种标准算法可以枚举所有可能性,例如。 这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM