首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在无限长轴上找到N个点,使M个点到其最近的N个点的距离和最小?

如何在无限长轴上找到N个点,使M个点到其最近的N个点的距离和最小?
EN

Stack Overflow用户
提问于 2019-07-19 20:38:57
回答 2查看 240关注 0票数 4

考虑在一条道路上有N个房子。我有M根灯杆。给定M< N,所有相邻房屋之间的距离是不同的。灯杆只能放在房子里。我必须把所有的灯杆都放在房子里,这样从每个房子到最近的灯杆的距离之和是最小的。我该如何编码这个问题呢?

经过一些研究,我知道我必须使用动态编程来解决这个问题。但我不知道如何解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-20 08:28:17

这是一个带有搜索空间O(n^2 * m)的简单动态程序。也许其他人知道另一个加速?应从代码中的函数f中清除递归。

JavaScript代码:

代码语言:javascript
运行
复制
// We can calculate these in O(1)
// by using our prefixes (ps) and
// the formula for a subarray, (j, i),
// reaching for a pole at i:
//
// ps[i] - ps[j-1] - (A[i] - A[j-1]) * j
//
// Examples:
// A:  [1,2,5,10]
// ps: [0,1,7,22]
// (2, 3) =>
//   22 - 1 - (10 - 2) * 2
//   = 5
//   = 10-5
// (1, 3) =>
//   22 - 0 - (10 - 1) * 1
//   = 13
//   = 10-5 + 10-2
function sumParts(A, j, i, isAssigned){
  let result = 0
  for (let k=j; k<=i; k++){
    if (isAssigned)
      result += Math.min(A[k] - A[j], A[i] - A[k])
    else
      result += A[k] - A[j]
  }
  return result
}

function f(A, ps, i, m, isAssigned){
  if (m == 1 && isAssigned)
    return ps[i]
    
  const start = m - (isAssigned ? 2 : 1)
  const _m = m - (isAssigned ? 1 : 0)
  let result = Infinity
    
  for (let j=start; j<i; j++)
    result = Math.min(
      result,
      sumParts(A, j, i, isAssigned)
        + f(A, ps, j, _m, true)
    )
  
  return result
}

var A = [1, 2, 5, 10]
var m = 2

var ps = [0]
for (let i=1; i<A.length; i++)
  ps[i] = ps[i-1] + (A[i] - A[i-1]) * i

var result = Math.min(
  f(A, ps, A.length - 1, m, true),
  f(A, ps, A.length - 1, m, false))

console.log(`A:  ${ JSON.stringify(A) }`)
console.log(`ps: ${ JSON.stringify(ps) }`)
console.log(`m:  ${ m }`)
console.log(`Result: ${ result }`)

票数 1
EN

Stack Overflow用户

发布于 2019-07-20 02:05:57

我帮你掩护好了巴德。我将首先写信解释动态编程算法,如果你不能编写它,请让我知道。

A->包含点的数组,因此Ai- Ai -1将是Ai和Ai-1之间的距离。A是第一点。当你自上而下地做记忆时,你将不得不处理当你想要在当前房子中放置一个灯杆或者你想要将它放在较低索引的情况下。如果你现在放置它,你会递归到少了一个可用的灯杆,并计算与以前的房子的距离之和。当你没有留下任何灯杆或你完成了所有的房子时,你处理基本情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57112684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档