【问题标题】:Solving addition chain problems using dynamic programming使用动态规划解决加法链问题
【发布时间】:2012-05-04 07:01:59
【问题描述】:

给定一个正整数 A。目标是使用以下规则构建以 A 结尾的最短整数序列:

  1. 序列的第一个元素是 1
  2. 每个连续元素都是前面任意两个元素的总和(也允许向自身添加单个元素)
  3. 每个元素都大于前面的所有元素;也就是说,序列是递增的。

例如,对于 A = 42,可能的解决方案是:

[1, 2, 3, 6, 12, 24, 30, 42]

A = 42 的另一种可能的解决方案是:

[1, 2, 4, 5, 8, 16, 21, 42]

看完问题陈述后,我首先想到的是dynamic programming(DP),因此我将其表示为search problem并尝试编写递归解决方案。

直到 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解决是错误的?

【问题讨论】:

    标签: algorithm dynamic-programming


    【解决方案1】:

    这是一个加法链...

    http://en.wikipedia.org/wiki/Addition_chain

    没有已知的算法可以计算 给定数量的最小加法链,并保证 合理的时间或小的内存使用。然而,几种技术 计算相对较短的链存在。一个非常有名的 计算相对较短的加法链的技术是 二进制 方法,类似于平方取幂。其他知名 方法是因子法窗口法

    另请参阅:New Methods For Generating Short Addition Chains IEICE Transactions on Fundamentals of Electronics、Communications and Computer Sciences。

    【解决方案2】:

    这个问题有一个纯动态规划的解决方案。但与所有 DP 解决方案一样,内存和时间的复杂度都是 N 平方。所以它可能是一个太空猪。但这里是专为 DP 爱好者提供的 DP 解决方案的症结所在:

    概括:

    而不是找到N即加法链的最小长度。 l(N),我们要找到包含 i 和 j 的加法链的最小长度,其中 i ≤ j 和 j 是链中的最大值。将此长度称为 A(i, j)。显然,我们有
    1. l(N) = A(1, N) = A(N,N)
    2. A(1, N) = A(2, N) 如果 N ≥ 2
    3. A(1, N) = 1+min (A(i, j) for 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+min(A(50, 52), A(48, 52), A(52, 99), A(52, 98)) 分别应用H2-H5 .

    【讨论】:

    • 这种说法并不准确:“但与所有 DP 解决方案一样,内存和时间的复杂度都是 N 平方。” DP 解决方案各不相同。
    • 在数学证明中,我建议不要说“显然,我们有... [方程列表]”。请参阅matheducators.stackexchange.com/questions/1896 很多人不会发现“A(1,N) = 1+min (A(i,j) for 1 ≤ i ≤ j 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)。没有它,整体的递归关系是不完整的。
    【解决方案3】:

    由于规则 #2,

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

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

    【讨论】:

    • 不,因为子问题有几种可能的解决方案,我们不知道该使用哪一种。参考规则#3
    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    相关资源
    最近更新 更多