本帖最后由 jerryxjr1220 于 2017-7-31 13:25 编辑
这题粗看上去还是比较复杂的,一开始我准备穷举所有情况,但是算了一下一共有3**30种可能,然后就放弃了。
换一种思路,可以利用动态规划的思想:
假设没有迟到的情况下,n天获得奖励的情况是F(n),
那么当第1天为“O”时,f1=F(n-1)
当第1天为“A”,第2天为“O”时,f2=F(n-2)
当第1天为“A”,第2天为“A”,第3天为“O”时,f3=F(n-3)
F(n) = f1+f2+f3 = F(n-1)+F(n-2)+F(n-3), F(0) = 1, F(1) = 2, F(2) = 4
有1天迟到的情况下,把n天看成前i天不迟到+第i天迟到+后n-1-i天不迟到的情况。
F'(n) = sum((F(i)*F(n-1-i) for i in range(n)))
这样只要统计总天数就可以了。
S(n) = F(n) + F'(n)from functools import lru_cache
@lru_cache(maxsize=None)
def F(n):
return 2**n if n<3 else F(n-1)+F(n-2)+F(n-3)
def S(n):
return F(n) + sum((F(i)*F(n-1-i) for i in range(n)))
print(S(30))
1918080160
[Finished in 0.2s] |