最后的算法舞蹈

时间:2016-11-20 20:27:52

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

[上一个相关问题:A dance with an aglorithm's complexity]

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

我知道我跳舞的每首歌我能得到什么分数,我希望最大化我的总分。

所以,我有三个数组:

  • 得分 i )是我可以通过歌曲# i 跳舞得分。
  • prep i )是我必须在歌曲# i 之前跳过的歌曲数量,否则我无法做到歌曲#。 (例如,如果 prep (4)= 2,那么除非我跳过歌曲#2和歌曲#3,否则我不能跳到#4歌曲。)
  • 休息 i )是歌曲# i 之后我必须立即跳过的歌曲数量,如果我做了歌曲# I 的。 (例如,如果 rest (4)= 2,我跳到#4歌曲,那么我必须跳过第5首歌和第6首歌。)

prep i )和 rest i )都没有超过上限,称之为< EM>中号

如何最大化我的分数?它的复杂性是什么?

我的尝试:

根据已经给出的答案,采取那个

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应该下降,正如我的链接问题所述。有人可以帮忙吗?这种重叠使我感到困惑。

1 个答案:

答案 0 :(得分: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)))
             )

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

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

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