动态规划最小化平方和

时间:2011-12-15 06:59:31

标签: algorithm complexity-theory dynamic-programming

我在练习考试中有这个问题,并且不知道如何解决它,所以我非常害怕决赛。无论如何,发现这个问题有一个答案将是缓解,并将帮助我理解动态编程,所以感谢阅读:)

问题:

  

给定一系列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)......

中完成它

1 个答案:

答案 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的值并将它们存储在一个数组中。