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算法的递归(自上而下)实现与分治算法进行比较。