动态编程问题,可在创建非递减数组时最大程度地降低成本

时间:2019-02-27 22:44:20

标签: arrays algorithm dynamic difference minimize

我已经解决了一段时间这个问题,无法想到使用动态编程来解决此问题的有效方法。

我正在创建的算法被赋予一个整数数组{y_1 ... y_n}和一个参数M,并且必须返回一个不递减的整数数组{x_1 ... x_n},其中没有更大的值在两个数组中小于M或小于0。必须这样做以最小化总和({X_i-Y_i} ^ 2)。

如您所见,这不是一个可以贪婪解决的简单问题。解决方案必须在O(nM)时间内。

1 个答案:

答案 0 :(得分:1)

我们填写表Cost(i, j),其中i in {1, ..., n}j in {0, ..., M}Cost(i, j)的解释是,它是子问题y_1, ..., y_i的最低成本,限制为j,其中x_i = j(某些y值可能更大而不是j,但仍然可以很好地定义问题)。我们对所有i in {2, ..., n}和所有j in {0, ..., M}都有一个重复发生,

                      2
Cost(1, j) = |j - y_i|
                                             2
Cost(i, j) =   min   Cost(i-1, k) + |j - y_i|
             0<=k<=j

天真的,这是M太慢的原因。但是,如果我们以正确的顺序评估Cost,则可以用之前的分钟和Cost(i-1, j)的分钟替换该分钟,并获得所需的运行时间O(n M)