动态规划减小平方和的算法

3

我在练习考试中遇到了这个问题,不知道该如何解决,所以非常担心期末考试。然而,找到这个问题的答案将会舒缓我的压力,并帮助我理解动态规划。谢谢您的阅读 :)

问题:

给定一个由 n 个数字 a1, ..., an(正数或负数) 组成的序列,我们希望将该序列分为若干块,使得每块数字之和的平方和最小,同时满足每一块包含至少2个元素且至多4个元素的约束条件。换句话说,我们要找到1=i[0]

我的问题: 定义子问题。我唯一的线索是持续找到长度为4到2的最小和,但如果有1个剩下的数字怎么办?它是加入到现有的长度为2或3的组中,还是拆分成4个数字的块?更不用说在O(n)时间内完成了...

1个回答

5

子问题是:在前k个数中找到最小值。

以下是如何将问题归约为已经解决的子问题:

F(k)为求解a1,a2,... ak时的最小平方和。

现在

F(2) = (a1+a2)^2
F(3) = (a1+a2+a3)^2
F(4) = min { (a1+a2+a3+a4)^2, (a1+a2)^2 + (a3+a4)^2 }
F(5) = min { (a1+a2+a3)^2 + (a4+a5)^2, (a1+a2)^2 + (a3+a4+a5)^2 }

F(n) = min {
              F(n-2) + (a[n-1]+a[n])^2,
              F(n-3) + (a[n-2]+a[n-1]+a[n])^2,
              F(n-4) + (a[n-3]+a[n-2]+a[n-1]+a[n])^2
       }

您可以编写一个简单的函数来计算递增值k的F(k)并将它们存储在数组中。

哦!非常有趣。出于某种原因,我一直认为数字的顺序是无关紧要的。谢谢! - Garrett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接