题目:原题链接(中等)
标签:动态规划
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
---|---|---|---|
Ans 1 (Python) | O ( N 2 ) O(N^2) O(N2) | O ( N 2 ) O(N^2) O(N2) | 4052ms (60.65%) |
Ans 2 (Python) | |||
Ans 3 (Python) |
解法一:
class Solution:
def stoneGameVII(self, stones: List[int]) -> int:
n = len(stones)
# 计算前缀和数列
prefix = [0]
now = 0
for s in stones:
now += s
prefix.append(now)
# print("前缀和:", prefix)
dp = [[0] * n for _ in range(n)]
for l in range(1, n):
for i in range(n - l):
j = i + l
# 当剩下2个石头时
if l == 1:
dp[i][j] = max(stones[i], stones[j])
# 当剩下3个及以上的石头时
else:
# print((i, j), stones[i:j + 1], "拿走:", stones[i], "->", (prefix[j + 1] - prefix[i + 1]),
# dp[i + 1][j], "=", prefix[j + 1] - prefix[i + 1] - dp[i + 1][j])
# print((i, j), stones[i:j + 1], "拿走:", stones[j], "->", (prefix[j] - prefix[i]), dp[i][j - 1], "=",
# (prefix[j] - prefix[i]) - dp[i][j - 1])
dp[i][j] = max((prefix[j + 1] - prefix[i + 1]) - dp[i + 1][j], # 拿掉i
(prefix[j] - prefix[i]) - dp[i][j - 1]) # 拿掉j
# for row in dp:
# print(row)
return dp[0][-1]