簡體   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