我写的蛮力写到N=4
,我想知道是否可以用一个简单的递归公式来表达它。
f({A}) = 1 * (A)
= A
f({A,B}) = 2 * (A + B) + 1 * (A) + 1 * (B)
= 3A + 3B
f({A,B,C}) = 3*(A+B+C)+2*(A+B)+2*(B+C)+2*(A)+1*(B)+2*(C)
= 7A + 8B + 7C
f({A,B,C,D}) = 4*(A+B+C+D)+3*(A+B+C)+3*(B+C+D)+4*(A+B)+2*(B+C)+4*(C+D)+4*(A)+2*(B)+2*(C)+4*(C)
= 15A + 18B + 18C + 15D
我实际上不确定通过原始数组的连续子部分(如我上面每个等于的第一部分)或单个数字来查看它们是否更重要。
我看到如果我按个别数字对它们进行分组,则第一个和最后一个是2^n - 1
,其中n
是数组的大小。
答案 0 :(得分:1)
我想我开始在这里看到一个模式,看看数据
F([A]) = A
F([A,B]) = 3A + 3B
F([A,B,C]) = 7A + 8B + 7C
F([A,B,C,D]) = 15A + 18B + 18C + 15D
按公共因素对它们进行分组,并将其留在附加内容
F([A]) = A
F([A,B]) = 3(A+B)
F([A,B,C]) = 7(A + B + C) + B
F([A,B,C,D]) = 15(A + B + C + D) + 3(B+C)
他们出现的模式是跟随
F([]) = 0
F(X) = (2^n-1)*sum(X) + F(center(X))
其中n
是X的大小,sum(X)
是X中元素的总和,center(X)
是一个删除给定数组的第一个和最后一个元素的函数
然后下一个是
F([A,B,C,D,E]) = 31(A+B+C+D+E) + F([B,C,D])
= 31(A+B+C+D+E) + 7(B+C+D) + C
= 31A + 38B + 39C + 38D + 31E
答案 1 :(得分:0)
看一下这个模式,我想出了一个与Copperfield略有不同的解决方案,即在没有更多中心的情况下继续重新应用中心逻辑,而不是只应用一次:
F(x) = (2^n - 1) * sum(x) + F(center(x)) + F(center(center(x)) ....
F({A}) = 1A
F({A,B}) = 3A + 3B
F({A,B,C}) = 7A + 8B + 7C
F({A,B,C,D}) = 15A + 18B + 18C + 15D
F({A,B,C,D,E}) = 31A + 38B + 40C + 38D + 31E
F({A,B,C,D,E,F}) = 63A + 78B + 84C + 84D + 78E + 63F
结果是相同的,直到F({A,B,C,D,E})
,其中C项比Copperfield大一个:
F({A,B,C,D,E}) = 31(A+B+C+D+E) + F({B,C,D}) + F({C})
= 31(A+B+C+D+E) + 7(B+C+D) + C + C
= 31A + 38B + 40C + 38D + 31E
从那里差异增加。可以从提供的数据中进行解释,直到OP提供下一个术语以查看哪个解决方案是正确的(或者两者都是错误的。)
最后,OP的最后一个等式在最终术语中似乎是一个错误:
f({A,B,C,D}) = 4*(A+B+C+D)+3*(A+B+C)+3*(B+C+D)+4*(A+B)+2*(B+C)+4*(C+D)+4*(A)+2*(B)+2*(C)+4*(C)
可能应该是:
f({A,B,C,D}) = 4*(A+B+C+D)+3*(A+B+C)+3*(B+C+D)+4*(A+B)+2*(B+C)+4*(C+D)+4*(A)+2*(B)+2*(C)+4*(D)