我即将参加舞蹈比赛,明天是重要的一天!我知道在比赛的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))
,然后在每一步中选出最好的两个。有人可以帮忙吗?
答案 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)。