【问题标题】:Biggest sum of value for n stairs with value and use the given stepn个楼梯的最大价值总和,并使用给定的台阶
【发布时间】:2018-03-26 10:05:26
【问题描述】:

给定一个带有n 楼梯的楼梯,每个楼梯都包含一个整数值,例如,

staircase = [11, 22, 44, 5, 12, 34, 55, 45, 23, 64]

并给定一组可能的楼梯步长,例如,

possible_steps = {3,4,5}

我想找到步骤的顺序,以最大化收集值的总和。一旦您踏上楼梯,就会收集一个值。

示例:

step_sequence 是 [3,4] ,值是 44+55 = 99

step_sequence 是 [4,4,4] ,值是 5+45+(out of index is 0) = 50

最好的step_sequence 是[3,4,4],它可以最大化收集到的值 (44+55+64 = 163)

问题:

如何使用动态规划来解决问题?或者是用动态规划解决问题的最好方法?

【问题讨论】:

  • 我现在试了 5 分钟,但我无法理解这个问题。似乎你想在上楼梯时最大化收集到的价值。步骤是如何使用的?你有什么限制? “我们可以直接通过结束”是什么意思?
  • 是的,问题是找到收集值的最大值,使用给定的步骤 [3,4,5] \n 抱歉“我们可以直接通过结束”。这意味着步骤不允许以最后一个楼梯结束。
  • 我是否正确理解给定楼梯和台阶,您想找到最大化收集值的台阶顺序?从您的示例来看,似乎也允许重用步骤。
  • 这是作业吗?你应该这样标记它。
  • 到目前为止你尝试过什么?分享你的发现。

标签: algorithm dynamic-programming


【解决方案1】:

是的,您可以使用动态规划来解决它。如果n 是楼梯中数字的总数,m 是可能的步骤数,则解的时间复杂度为O(nm),空间复杂度为O(n)。这个想法是问自己,当楼梯在索引i 处结束时,我能得到的最好的总和是多少。有点类似于硬币找零的问题。

function maxSum(stairs, steps) {
    let dp = [], maxSteps = steps[0], globalBest = undefined
    for (let i = 1; i < steps.length; i++)
        if (steps[i] > maxSteps)
            maxSteps = steps[i]
    for (let i = 0; i < stairs.length; i++) {
        let best = undefined
        for (let j = 0; j < steps.length; j++) {
            if (i - steps[j] == -1 && (best === undefined || best < stairs[i]))
                best = stairs[i]
            else if (i - steps[j] >= 0 && dp[i - steps[j]] !== undefined &&
                    (best === undefined || dp[i - steps[j]] + stairs[i] > best))
                best = dp[i - steps[j]] + stairs[i]
        }
        dp[i] = best
        if (best !== undefined && i + maxSteps >= stairs.length &&
                (globalBest === undefined || globalBest < best))
            globalBest = best
    }
    return globalBest
}

console.log(maxSum([11, 22, 44, 5, 12, 34, 55, 45, 23, 64], [3, 4, 5]))

有一些特殊情况,例如进入楼梯i - steps[j] == -1 或检查是否可以到达楼梯尽头以获取全局最大值i + maxSteps &gt;= stairs.length。其余的几乎都是标准的 dp。

此实现也适用于楼梯上的负数(台阶必须为正数)。假设您必须在楼梯上收集至少一个数字,如果不可能,该函数将返回 undefined。

【讨论】:

    猜你喜欢
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 2020-07-21
    • 2015-12-25
    相关资源
    最近更新 更多