Algorithm 计算给定数字序列中每个部分最多可拆分的方式数K

Algorithm 计算给定数字序列中每个部分最多可拆分的方式数K,algorithm,dynamic-programming,Algorithm,Dynamic Programming,大家好,我正在练习动态编程,遇到了以下问题: 给定一个数字K,0使用动态规划意味着您需要从子问题的角度来考虑问题 让我们用N[i..]表示N的后缀,从索引i开始(例如,对于N=45678955,我们有N[3…]=78955 让我们用dp[i]表示划分N[i..]的可能方式的数量,这样每个部分最多是K 我们还将使用一个小函数,max\u part\u len(N,K,i),它将表示从i开始的“部分”的最大长度。例如,对于N=45678955,K=37,i=3,我们有max_part_len(N,K

大家好,我正在练习动态编程,遇到了以下问题:


给定一个数字K,0使用动态规划意味着您需要从子问题的角度来考虑问题

让我们用
N[i..]
表示
N
的后缀,从索引
i
开始(例如,对于
N=45678955
,我们有
N[3…]=78955
让我们用
dp[i]
表示划分
N[i..]
的可能方式的数量,这样每个部分最多是
K

我们还将使用一个小函数,
max\u part\u len(N,K,i)
,它将表示从
i
开始的“部分”的最大长度。例如,对于
N=45678955,K=37,i=3
,我们有
max_part_len(N,K,i)=1
,因为
7<37
但是
78>37

现在我们可以在dp[i]上写出递归(或归纳)关系。
dp[i]=总和(从1到最大部分长度(N,K,i))dp[i+j

这种关系意味着划分
N[i..]
使每个部分最多为
K
的可能方式的数量为:

除以N[i+j..]
的可能方法的数量之和,使得每个部分最多为
K
,对于每个j,
N[i…j],我认为我们也可以使用分治。让
f(l,r)
表示从
l
r
索引的数字范围的划分方法,以便每个部分最多为
k
。然后将字符串,
45678955
分成两部分:

4567    8955
结果是

f(4567) * f(8955)
再加上一个分割部分,该分割部分的每一侧至少包含一个分割部分,因此每个左延伸部分与所有右延伸部分配对。假设
k
为1000。然后

f(456) * 1 * f(955) +   // 78
f(456) * 1 * f(55) +    // 789
f(45)  * 1 * f(955)     // 678
其中对
f
的每个调用都执行类似的分治

下面是比较m.raynal算法的递归(自上而下)实现与此分而治之的JavaScript代码:

函数最大部分长度(N,K,i){
设d=0;
设a=0;

while(在我的答案中添加了一段JavaScript代码,将m.raynal算法的递归(自上而下)实现与分治算法进行比较。