如果我不误解您,我认为可以在时间内按如下方式计算最小成本因式分解。O(n2)
对于每个索引i,我们将为计算一堆值,如下所示。令为最小整数,使得存在满足的整数对于这个特定的,令是具有此属性的最大。如果不存在这样的,则将设置为该索引有零个值。(pℓi,rℓi)ℓ=1,2,…p1i≥1r≥2S[i−rp1i+1,i−p1i]=S[i−(r−1)p1i+1,i].
p1ir1irpiLi=0(pℓi,rℓi)
令是严格大于的最小整数,同样,
for a。像以前一样,将设为具有固定的最大值。通常,是严格小于的最小数字。如果不存在这样的,则。p2i(r1i−1)p1iS[i−r2ip2i+1,i−p2i]=S[i−(r2i−1)p2i+1,i]
r2i≥2r2ip2ipℓi(rℓ−1i−1)pℓ−1ipℓiLi=ℓ−1
请注意,由于值随几何增加,因此对于每个索引i,我们都有。(如果存在,则它不仅严格大于而且至少大于(建立了几何增量。 )Li=O(log(i+1))pℓiℓpℓ+1i(rℓi−1)pℓipℓi/2
现在假设所有值都给了我们。最低成本由递归
的理解是,对于我们设置。该表可以用时间。(pℓi,rℓi)dp(i,j)=min{dp(i,j−1)+1,minℓ(dp(i,j−rℓjpℓj)+dp(j−rℓjpℓj+1,j−pℓj))}
i>jdp(i,j)=+∞O(n2+n∑jLj)
在上面我们已经观察到通过对项和项进行限制。但是实际上,如果我们看一看全部金额,我们可以证明更清晰一些。∑jLj=O(∑jlog(j+1))=Θ(nlogn)
考虑后缀树的反向的(即,S的前缀树)。我们会和每一贡献充电到的边缘,这样每个边将最多一次充电。将每个充电到并向发出的边缘。这里的是与相对应的前缀树的叶子,nca表示最近的公共祖先。T(S←)S∑iLiT(S←)pjinca(v(i),v(i−pji))v(i−pji)v(i)S[1..i]
这表明。值可以通过对后缀树的遍历在时间进行计算,但是如果有人感兴趣,我将把细节留给以后的编辑。O(∑iLi)=O(n)(pji,rji)O(n+∑iLi)
让我知道这是否有意义。