在长度为2到n + 1的所有可能子序列上打印元素总和的高效算法

时间:2015-10-07 06:52:17

标签: arrays algorithm math discrete-mathematics subsequence

我将从一个例子开始。假设我们有一个大小 3 的数组,其中元素abc类似:(其中a,{{1 }和b是一些数值

  

| 1 | 2 | 3 |
| a | C | Ç|

假设索引从1开始,如上例所示

现在所有可能增加的长度 2 的子序列都是:

  

12 23 13

因此需要这些索引的元素乘积之和,即c

对于长度 3 ,我们只有一个增加的子序列,即123,因此应打印ab+bc+ac
对于长度 4 ,我们没有序列,因此打印abc并且程序终止。

因此给定数组的输出将为:

0

例如,如果元素ab+bc+ac,abc,0 ab分别为1,2和3,则输出应为c

同样,对于大小为 4 的数组,其元素为a,b,c,d,输出将为:

11,6,0

依旧......

现在很明显,对于较大的数组大小,蛮力效率太低。我想知道是否有一种有效的算法来计算给定大小的数组的输出?

编辑1:我尝试找到一种模式。例如,对于大小 4

的数组

ab+ac+ad+bc+bd+cd,abc+abd+acd+bcd,abcd,0

但它仍然需要大量的计算,我无法找到一种有效的方法来实现它。

编辑2 :我的问题与this不同,因为:

  1. 我不需要所有可能的排列。我需要从长度2到n + 1的所有可能增加的子序列。
  2. 我也不需要打印所有可能的序列,我只需要这样获得的值(如上所述)因此我正在寻找一些数学概念或/和一些动态编程有效解决这个问题的方法。
  3. 注意我基于索引值找到所有可能的这种增加的子序列的集合,然后基于如上所述的那些索引位置处的值进行计算。

1 个答案:

答案 0 :(得分:0)

作为一个似乎已经消失的帖子指出一种方法是获得一个递归关系。令S(n,k)是由序列索引的数组元素的乘积的长度k的增加子序列(1..n)的和。这样的子序列要么以n结尾,要么不结束;在第一种情况下,它是1..n-1和{n}的长度为k-1的子序列的串联;在第二种情况下,它是长度为k的1..n-1的子序列。因此:

S(n,k) = S(n-1,k) + A[n] * S(n-1,k-1)

为此总是有意义,我们需要添加:

S(n,0) = 1
S(n,m) = 0 for m>n