【问题标题】:strings based on dynamic programming基于动态规划的字符串
【发布时间】:2018-06-30 05:25:07
【问题描述】:

我在动态规划中有这些问题,我需要提供一个基于动态规划的解决方案:

我们有长度为 n 的字符串,并且只包含 {A,B,C} 字符。字符串只有在连续不包含 3 个 A 并且最多包含一个 'B' 时才是“赢家”。 例子: 有 43 个长度为 4 的“获胜者”字符串。 我需要建议一种算法来计算长度为 n 的“获胜”字符串的数量。它需要以 O(n) 复杂度运行。

到目前为止我想到的是: 3个参数:n-当前字符串的长度,bCount=1,aCount=2。 在每次迭代中,n 减 1。如果我们使用 b,则 bCount 减 1。如果我们使用 A,则 aCount 减 1,但如果插入了任何其他字符,则它初始化为 2。

我需要把它正式和明确,希望你能帮助我填补空白,使解决方案正式。

我真的很努力解决它,如果有人能帮助我,我将非常感激。

提前谢谢你。

【问题讨论】:

    标签: algorithm dynamic dynamic-programming


    【解决方案1】:

    首先让我们看看 B。您要么没有 B,因此长度为 n 的字符串只有 A 和 C,或者您有一个包含 1 个 B 和 2 个子字符串的字符串,累积长度为 n - 1,只有 A 和 C . 因此,如果您可以计算任意长度字符串的所有有效 A 和 C 组合,那么剩下的就变得容易了。

    function winners(n) {
        let sum = combos[n]
        for (let i = 0; i < n; i++)
            sum += combos[i] * combos[n - i - 1]
        return sum
    }
    

    如何计算 A、C 组合?您可以使用动态编程(总是查看有多少字符串以 A、C 和 AA 结尾):

    combos = [1, 2]
    endsInA = 1
    endsInC = 1
    endsInAA = 0
    for (let i = 2; i <= n; i++) {
        combos[i] = (endsInA + endsInC) * 2 + endsInAA
        let c = endsInC
        endsInC = endsInA + endsInAA + c
        endsInAA = endsInA
        endsInA = c
    }
    

    它是(endsInA + endsInC) * 2 + endsInAA,因为在以A或C结尾的后面可以放A或C,而在以AA结尾的后面只能放C。更新规则也很容易理解。以 AA 结尾的字符串与之前以 A 结尾的字符串一样多,以 A 结尾的字符串与之前以 C 结尾的字符串一样多。 C 可以放在所有字符串的后面,所以它只是之前所有可能结尾的总和。你也可以先更新,然后只取所有结局的总和来获得连击数。

    Everything put together and optimized for a demo

    计算组合需要 O(n),计算获胜者需要 O(n),因此整个复杂度是 O(n)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      相关资源
      最近更新 更多