动态编程打破字符串

时间:2014-05-13 16:58:05

标签: java algorithm dynamic-programming

目标是计算在用户给出的断点处断开字符串的成本。所以我们假设以下内容: String的长度= 10所以lengthArray = [1,2,3,4,5,6,7,8,9,10] 和BreakPointArray = [5,3,2,6,1]。现在我们不必更改用户提供的休息顺序。

我能够找出这个问题的树结构

enter image description here

所以在breakPoints给出的断开String的总成本= 10 + 5 + 5 + 3 + 2 = 25 但是我无法提出实施部分。以下是我的方法:

我从BreakPoint = 5开始,将lengthArray分成

leftLength = [1,2,3,4,5]

rightLength = [6,7,8,9,10]

在BreakPoint = 3,我检查它应该在leftLength数组下面,所以我再次将leftLength分成2部分

leftLength1 = [1,2,3]

rightLength1 = [4,5]

在BreakPoint = 2,来自leftLength1,所以再次分为2部分

leftLength2 = [1,2]和

rightLength2 = [3]

现在我在BreakPoint = 6时遇到困难,因为它位于右上方。有人可以帮助我如何跟踪我所做的所有分区。我怎样才能回到第一个rightLength数组来计算breakPoint 6的成本。我正在尝试实现这个Java。

1 个答案:

答案 0 :(得分:2)

抱歉,这是Lua,但DP算法足够清晰

-- input constants
local L = 0
local R = 10
local BreakPoints = {5, 3, 2, 6, 1}

-- fill the arrays
local NearestRight = {}
local NearestLeft = {}
for k = L, R do
   NearestRight[k] = R
   NearestLeft[k] = L
end

-- calculating cost
local cost = 0
for _, BreakPoint in ipairs(BreakPoints) do
   local left = NearestLeft[BreakPoint]
   local right = NearestRight[BreakPoint]
   cost = cost + (right - left)
   for k = left + 1, BreakPoint - 1 do
      NearestRight[k] = BreakPoint
   end
   for k = BreakPoint + 1, right - 1 do
      NearestLeft[k] = BreakPoint
   end
end
print(cost)   -- outputs 25

时间复杂度为O(cost)