我将从一个例子开始。假设我们有一个大小 3 的数组,其中元素a
,b
和c
类似:(其中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
,a
和b
分别为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不同,因为:
答案 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