目标是计算在用户给出的断点处断开字符串的成本。所以我们假设以下内容: String的长度= 10所以lengthArray = [1,2,3,4,5,6,7,8,9,10] 和BreakPointArray = [5,3,2,6,1]。现在我们不必更改用户提供的休息顺序。
我能够找出这个问题的树结构
所以在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。
答案 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)