【问题标题】:Dynamic Programming Breaking a String动态编程打破字符串
【发布时间】:2014-05-13 16:58:04
【问题描述】:

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

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

所以在给定的断点处打破字符串的总成本 = 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 之下。有人可以帮助我如何跟踪我所做的所有分区。我怎样才能回到第一个 rightLength 数组来计算 breakPoint 6 的成本。我正在尝试实现这个 Java。

【问题讨论】:

  • 我只是在用 Java 实现之前编写伪代码,而当 BreakPoints 是随机的时,我没有进一步了解。如果你愿意,我可以分享
  • 你不能只构建一个结果数组的树和每个非叶节点的成本吗?然后应该不难找到包含当前包含元素 6 的数组的节点。
  • 我什至不明白你的成本函数和优化目标是什么——你能详细说明一下吗?
  • 我还没有达到优化部分,这是计算数组中所有断点的总成本的第一步,它们的顺序也与给定的顺序相同。完成此操作后,我将对用户给出的所有断点组合进行计算,并找出最便宜的组合以及成本
  • 如果您只想计算整个过程的成本,只需使用递归并返回每个步骤的成本。如果要返回产生最佳解决方案的配置,可以将其包含在返回值中。

标签: java algorithm dynamic-programming


【解决方案1】:

对不起,这是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)

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多