我已经解决了一段时间这个问题,无法想到使用动态编程来解决此问题的有效方法。
我正在创建的算法被赋予一个整数数组{y_1 ... y_n}和一个参数M,并且必须返回一个不递减的整数数组{x_1 ... x_n},其中没有更大的值在两个数组中小于M或小于0。必须这样做以最小化总和({X_i-Y_i} ^ 2)。
如您所见,这不是一个可以贪婪解决的简单问题。解决方案必须在O(nM)时间内。
答案 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)
。