【问题标题】:The last algorithmic dance最后的算法舞
【发布时间】:2017-04-04 04:33:15
【问题描述】:

[以前的相关问题:A dance with an aglorithm's complexity]

故事:我即将参加一个舞蹈比赛,有 n 首歌曲按特定顺序播放。不过,我不能每首歌曲都跳舞,因为我需要时间在每支舞前准备,然后有时间休息。 (幸运的是,一个舞蹈的休息时间可以与下一个舞蹈的准备时间重叠。)

我知道自己跳的每首歌可以得到什么分数,我想最大化我的总分。

所以,我有三个数组:

  • score(i) 是我随着歌曲 #i 跳舞可以获得的分数。
  • prep(i) 是我必须在歌曲 #i 之前跳过的歌曲数,否则我无法播放歌曲 #我。 (例如,如果 prep(4) = 2,那么除非我同时跳过了歌曲 #2 和歌曲 #3,否则我无法随着歌曲 #4 跳舞。)
  • rest(i) 是我必须在歌曲 #i 之后立即跳过的歌曲数,如果我做了歌曲 #i。 (例如,如果 rest(4) = 2,并且我随着歌曲 #4 跳舞,那么我必须跳过歌曲 #5 和歌曲 #6。)

prep(i) 和 rest(i) 都不会超过上限,称之为 M.

我怎样才能最大化我的分数?它的复杂性是多少?


我的尝试:

根据已经给出的答案,接受那个

Opt(i) = max(Opt(i+1),
             Score(i) + Opt(i + 1 + rest(i))) for i = 0..n-1.

并以此为基础,这样我们就有了像这样的死时间:

Opt(i + 1 + max(prep(i), rest(i)))

但我很担心,因为i 应该下降,正如我在链接问题中提到的那样。有人可以帮忙吗?这种重叠让我感到困惑。

【问题讨论】:

    标签: algorithm recursion max time-complexity dynamic-programming


    【解决方案1】:
    # Get the first song that can be danced to assuming he danced to `i` and wanted to wait till prep time of a song
    def myPrep(i):
        for j in range(i+1,n):
            if j - prep(j) > i:
                return j
    
    for i in range(0,n-1):
        Opt(i) = max(Opt(i+1),
                     (Score(i) + Opt(i + 1 + rest(i))),
                     (Score(i) + Opt(i + 1 + myPrep(i)))
                 )
    

    在这种情况下,我想到了三种可能性:

    • 跳过当前歌曲 -> Opt(i+1)
    • 跳到当前歌曲 -> Score(i)
      • 等待ith歌曲的休息时间或
      • 等待提供足够准备时间的第一首歌曲 -> myPrep(i)

    我与自己争论是否应该包括所有可能的歌曲,这些歌曲在ith 之后有足够的准备时间,但后来认为Opt(myPrep(i)) 应该得到正确的数字,因此我们不需要在之后包括所有歌曲myPrep(i)在计算ith歌曲

    【讨论】:

    • 我想到了类似 3 个操作数的 max,但 max 通常不与 2 一起使用?
    • Python max 函数接受任意大的输入,其他语言可能会有所不同,但如果是这种情况,您可以拆分 max,如 i = max(x, max(y,z))
    • 好的!我打算在 max 函数中使用 prep(i),而不是 myPrep(i)。你能解释一下吗? :)
    • 如评论中提到的,myPrep 如果他跳到i,则根据准备时间返回第一首可以跳到的歌曲。例如。如果prep = [2,1,1]i = 1myPrep(i) 将返回j = 2,这是prep 的第二个索引。
    猜你喜欢
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2013-11-10
    • 1970-01-01
    • 2010-10-09
    • 2023-01-28
    • 2013-03-17
    相关资源
    最近更新 更多