爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。 最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作: 选出任一 x,满足 0 < x < N 且 N % x == 0 。 用 N - x 替换黑板上的数字 N 。 如果玩家无法执行这些操作,就会输掉游戏。 只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。
def divisorgame(N):
if N <= 1:
return False
else:
dp = [False] * N
dp[0] = False
dp[1] = True
for i in range(3, N + 1): # N的实际取值
for j in range(1, i // 2 + 1):
if i % j == 0 and dp[i-1-j] == False:
dp[i-1] = True
break
return dp[-1]
所以此题就会转化为一个数学问题:
def divisorgame(N):
return N % 2 == 0
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
这个与上次写的爬楼梯问题基本完全一致,解法也一致,状态转移方程即dp[i] = dp[i-1] + dp[i-2] + dp[i-3]。值得注意的是这里在结果取模会导致超时,需要在过程中就取模。
def waysToStep(self, n: int) -> int:
left = 1
middle = 2
right = 4
if n == 1:
return left
elif n == 2:
return middle
elif n == 3:
return right
else:
for i in range(n-3):
left, middle, right = middle, right, (left + middle + right)%1000000007
return right