Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 用动态规划求解加法链问题_Algorithm_Dynamic Programming - Fatal编程技术网

Algorithm 用动态规划求解加法链问题

Algorithm 用动态规划求解加法链问题,algorithm,dynamic-programming,Algorithm,Dynamic Programming,给您一个正整数a。目标是使用以下规则构造以a结尾的尽可能短的整数序列: 序列的第一个元素是1 每个连续元素是任何两个之前元素的总和(也允许向其自身添加单个元素) 每个元素都大于前面的所有元素;也就是说,序列在增加 例如,对于A=42,可能的解决方案是: [1, 2, 3, 6, 12, 24, 30, 42] A=42的另一种可能的解决方案是: [1, 2, 4, 5, 8, 16, 21, 42] 在阅读了问题陈述之后,我想到的第一件事是(DP),因此我将其表示为一个,并尝试编写一个递归解

给您一个正整数a。目标是使用以下规则构造以a结尾的尽可能短的整数序列:

  • 序列的第一个元素是1
  • 每个连续元素是任何两个之前元素的总和(也允许向其自身添加单个元素)
  • 每个元素都大于前面的所有元素;也就是说,序列在增加
  • 例如,对于A=42,可能的解决方案是:

    [1, 2, 3, 6, 12, 24, 30, 42]
    
    A=42的另一种可能的解决方案是:

    [1, 2, 4, 5, 8, 16, 21, 42]
    
    在阅读了问题陈述之后,我想到的第一件事是(DP),因此我将其表示为一个,并尝试编写一个递归解决方案

    A=8以下的搜索空间为:

                    1
                    |
                    2
                   / \
                  /   \            
                 3     4
                /|\   /|\
               / | \ 5 6 8
              /  |  \
             4   5   6
           /| |\  
          5 6 7 8
    

    我们可以看到4发生在两个地方,但在这两种情况下,4岁的孩子是不同的。在一种情况下,先前的序列是[1,2,4]。在另一种情况下,先前的序列是[1,2,3,4]。因此,我们不能说我们有重叠的子问题。有没有办法将DP应用于上述问题?或者我判断它可以用DP解决是错误的?

    这是一个加法链

    目前还没有已知的算法可以计算 给定数的最小加法链 合理的时间或小内存使用。然而,有几种技术 要计算相对较短的链存在。一个非常有名的 计算相对较短的加成链的技术是二元法 方法,类似于平方求幂。其他著名的 方法是因子法窗口法

    另见:在IEICE电子、通信和计算机科学基础交易中。

    根据第2条规则

    每个连续元素是任意两个前面元素的总和


    该算法确实依赖于重复的子问题,因此动态规划适合于求解它

    这个问题有一个纯动态规划的解决方案。但与所有DP解决方案一样,内存和时间的复杂性都是N平方。所以它可能是一个太空猪。但这里是DP解决方案的关键,仅适用于DP爱好者:

    概括: 而不是寻找N viz的最小加成链长度。l(N),我们用i&leq求同时包含i和j的加成链的最小长度;j和j是链中的最大值。把这个长度称为A(i,j)。显然,我们有

  • l(N)=A(1,N)=A(N,N)
  • A(1,N)=A(2,N)如果N≥二,
  • A(1,N)=1+min(A(i,j)表示1≤i≤j 预先计算

    为了使用较小的A(i,j)来计算任何A(m,n),这是一个典型的DP步骤,我们应用了许多启发式方法

    H1:沿途(3)的最小部分保持S(i+j)。然后

     A(1, n) = A(2, n) = A(n, n) = S(n)+1
    
    对于其他m,我们通过在链中最多引入一个新元素来减少n,对于这样一个新元素,我们只需要再多一步就可以得出a(m,n)

    H2:如果n是偶数,我们尝试将n/2引入链
    H3:尝试将n-m引入链
    H4:尝试将n-1引入链
    H5:尝试将n-2引入链(当n>2时)

    所以A(m,n)取m的最小值A和基于H2-H5的约化n,加上1


    例如,A(52,100)=1+分钟(A(50,52),A(48,52),A(52,99),A(52,98)),分别应用H2-H5。

    否,因为子问题有几种可能的解决方案,我们不知道使用哪一种。参考规则#3该陈述不准确:“但作为所有DP解决方案,内存和时间的复杂性都是N平方。”DP解各不相同。在数学证明中,我建议不要说“显然,我们有…[等式列表]”。参见,许多人不会发现“A(1,N)=1+min(A(I,j)为1≤ 我≤ 两个例子会帮助很多人,一个是偶数,一个是奇数;
    A(1,8)=1+min{A(1,7),A(2,6),A(3,5),A(4,4)}
    A(1,7)=1+min{A(1,6),A(2,5),A(3,4)}
    。这些例子让读者更清楚地了解A(i,j)的原因构造是优雅的;它以同样的方式处理偶数和奇数情况。澄清问题你所说的“提前计算”标题是什么意思?这是一个打字错误吗?你是说“提前计算”和“改进计算”中的“启发式”一样吗?我想看一下“泛化”第节包括另一个等式:A(i,j)的一般递推关系(其中i不是1)。没有它,整个递推关系是不完整的。另见