一种具有丰富复杂性的舞蹈

时间:2016-11-20 17:17:11

标签: algorithm loops recursion max dynamic-programming

我即将参加舞蹈比赛,明天是重要的一天!我知道在比赛的n首歌及其订单中列出了该列表。经过大量的侦察,我能够确定评委和我的技能如此之好,以至于如果我跳过列表的第i首歌,即score(i),我就可以准确地预测我的结果。

然而,在第i首歌之后,我需要时间休息,即我不能跳下一首rest(i)首歌曲,即歌曲i + 1,...,i + rest(i)。我可以跳舞的歌曲数量没有其他限制。提供有效的算法来计算理想的最高总分及其复杂程度。

所以我认为应该使用递归,max(i) = max(i + 1)max(i) = score(i) + max(i + 1 + rest(i)),然后在每一步中选出最好的两个。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

递归将是,

r = resting interval
0 is the situation where it is better not to dance at all :)

其中,

score(i)

编辑1:添加说明

基本情况是参与者不跳舞,所以总得分为0

否则,他要么在某首歌上跳舞,要么不跳舞。所以决定归结为他是否应该在这首歌上跳舞,以便最终得分最大化。

如果他决定跳舞,他将获得rest(i)并且无法为score(i) + DP(i + rest(i))跳舞,因此剩余的最高分数将是DP(i+1)

的值

如果他决定不在这首歌上跳舞,则得分为LogonPstStore

因为我们想要最大化分数,我们选择这两个值中的最大值。

答案 1 :(得分:2)

让n首歌曲被索引为0..n-1。让Opt(i)成为最高总分,因为我们可以自由地从歌曲开始跳舞。 Opt的重现是

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

直观地说,我们要么不跳舞歌曲,要么得到剩余时间的价值,要么我们这样做,得分歌曲,休息,并获得休息后的时间值。

应该针对i降序评估此重复,并将先前计算的值缓存在数组中。运行时间为O(n)。