【问题标题】:How many sub-sequences of unique elements can be possible?有多少独特元素的子序列是可能的?
【发布时间】:2019-09-09 14:37:07
【问题描述】:

我有一个整数序列[A1, A2, A3.....AN] 我正在尝试计算最多包含 K 个唯一数字的所有子序列。

例如:

给定序列:: [2, 3, 3, 7, 5]K = 3

所有子序列是:

[],
[2],[3],[3],[7],[5],
[2, 3],[2, 3],[2, 7],[2, 5],[3, 3],[3, 7],[3, 5],[3, 7],[3, 5],[7, 5],
[2, 3, 3],[2, 3, 7],[2, 3, 5],[2, 3, 7],[2, 3, 5],[2, 7, 5],[3, 3, 7],[3, 3, 5],[3, 7, 5],[3, 7, 5],
[2, 3, 3, 7],[2, 3, 3, 5],[2, 3, 7, 5],[2, 3, 7, 5],[3, 3, 7, 5],
[2, 3, 3, 7, 5]

我需要所有具有唯一元素的子序列(仅用于计数)。

✅计数的子序列是:

[],
[2],[3],[3],[7],[5],
[2, 3],[2, 3],[2, 7],[2, 5],[3, 7],[3, 5],[3, 7],[3, 5],[7, 5],
[2, 3, 7],[2, 3, 5],[2, 3, 7],[2, 3, 5],[2, 7, 5],[3, 7, 5],[3, 7, 5]

总计 = 22

⛔ 未计算的子序列是:

[3, 3],
[2, 3, 3],[3, 3, 7],[3, 3, 5]

⛔ 忽略更长的长度:length > K(如果 k = 5 则忽略重复元素???):

[2, 3, 3, 7],[2, 3, 3, 5],[3, 3, 7, 5],
[2, 3, 3, 7, 5]

[注:所有子序列不是唯一的,但它们的元素(编号)应该相同。 Ex- [2, 3],[2, 3] 都被计算,但 [3, 3] 被忽略 ]

::代码::

import itertools as it
import sys, math

n, m = map(int, sys.stdin.readline().split())
a = list(map(int, sys.stdin.readline().split()))

cnt = 0
for i in range(2, m+1): 
  for val in it.combinations(a, i):
    if len(set(val)) == i:
      cnt += 1
print(1+n+cnt)

输入:

5 3
2 3 3 7 5

输出:22

但是我需要一个有效的解决方案,可能是使用nCretc 的数学解决方案或程序解决方案。

约束:

1 <= K <= N <= 1,000,00
1 <= Ai <= 9,000

时间: 1 sec

您的帮助/试图提供帮助将不胜感激??????。

感谢阅读????

【问题讨论】:

  • “给我一些代码”不是问题,我没有看到 c++ 标签的任何其他相关性,所以我删除了它
  • 我会将[2, 3, 3, 7, 5] 转换为{2:1, 3:2, 7:1, 5:1},然后对于每个与键的组合,您乘以相应的值。
  • @Jarod42 你能解释一下吗?
  • @CeliusStingher : 表情符号不是为了影响,而是为了视觉描述。
  • @foreknownas_463035818 听起来不错。

标签: python math subsequence


【解决方案1】:

试试这个:

import numpy as np
mod = 1000000007
n, k = map(int, input().split())
a = list(map(int, input().split()))
fre = [0]*10000
A = []
for i in range(0, n):
    fre[a[i]] += 1
for i in range(0, 9001):
    if fre[i] > 0:
        A.append(fre[i])   
kk = min( len( A ), k ) + 1
S = np.zeros( kk, dtype=int );   S[0] = 1
for a in A:
   S[1:kk] = (S[1:kk] + (a * S[0:kk-1])% mod) % mod
ans = 0
for s in S:
    ans = ((ans + s) % mod)
print(ans)

此程序返回所有具有唯一元素的子序列(仅用于计数)。

【讨论】:

  • 它有效,正在尝试获取您的算法,如果需要请提供帮助...谢谢?
  • 好的,我是来帮你的:)
【解决方案2】:

试试这个:

import itertools 

def findsubsets(s, n): 
    return list(itertools.combinations(s, n))

my_list = [2, 3, 3, 7, 5]
list_len = 0

for i in range(1,len(my_list)):
    list_len += len(set(findsubsets(my_list, i)))

print(list_len)

输出:

22

编辑: 从列表中删除具有相同数字的排列:

import itertools 

def findsubsets(s, n): 
    return list(list(x) for x in itertools.combinations(s, n))

my_list = [2, 3, 7, 5, 3]
list_len = 0

for i in range(1,len(my_list)):
    list_len += len(set(tuple(sorted(i)) for i in findsubsets(my_list, i)))

print(list_len)

输出:

22

【讨论】:

  • 效率没有改变。此外,对于输入 2 3 7 5 3 输出 28
  • @AfrinMouDia 你说得对!现在我删除具有相同数字的排列! ;)
  • 这不是我真正想要的。我需要删除 itertools.combinations(),否则 TLE。请查看限制条件和时间限制。
  • @AfrinMouDia 嗯...看看这个stackoverflow.com/questions/53419536/…
  • 是的,这就是为什么我需要在不生成子序列的情况下计算(计数)数字。
猜你喜欢
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多