我在练习考试中有这个问题,并且不知道如何解决它,所以我非常害怕决赛。无论如何,发现这个问题有一个答案将是缓解,并将帮助我理解动态编程,所以感谢阅读:)
问题:
给定一系列n个数a1,...,a(正或负),我们 想要将序列分成块,以便最小化 块的平方和,受每个约束的约束 块包含至少2个,最多4个元素。换句话说,我们 想要找到1 = i [0]&lt;我[1]&lt;我[2]&lt; ......&lt;我[k-1]&lt;我[k] = n + 1到 最小化(ai [0] + ... + ai [1] -1)^ 2 +(ai [1] + ... + ai [2] -1)^ 2 + ... + (ai [k-1] + ... + ai [k] -1)^ 2,使得2 <= i [1] -i [0]&lt; = 4,2 <= i [2] - i [1]&lt; = 4,...,2&lt; = i [k] - i [k-1]&lt; = 4.(注意数字 没有给出块k。)呈现O(n)时动态编程 算法解决问题。
我的问题:定义子问题。我唯一的线索是不断找到长度为4到2的最小总和,但是如果剩下1个怎么办?它是否加入现有的长度为2或3的组,或者是4组分组?更别说在O(n)......
中完成它答案 0 :(得分:5)
子问题是:找到前k个数字的miminum。 以下是如何将问题减少到已经解决的子问题:
当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
}
你可以写一个简单的函数来计算F(k)来增加k的值并将它们存储在一个数组中。