Skip to content

Commit cbb057f

Browse files
authored
Update 877.石子游戏.py
1 parent 26c6e14 commit cbb057f

File tree

1 file changed

+11
-17
lines changed

1 file changed

+11
-17
lines changed

leetcode/877.石子游戏.py

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,21 @@
1-
# dp[i][j]:表示在piles中下标i至下标j之间的玩家1所拿石子总数与玩家2所拿石子总数之差。dp[i][j]>0 表示玩家1赢
1+
# dp[i][j]:表示在piles中下标i至下标j之间的玩家1比玩家2多拿的石子数。dp[i][j]>0 表示玩家1赢
22
# 子问题:dp[i+1][j]和dp[i][j-1]
33
# 初始状态:dp的初始状态是i=j即只有一个石子堆,由于玩家1先拿,则dp[i][j]=piles[i]
44
# 状态方程:dp[i][j] = max(piles[i] - dp[i+1][j], piles[j] - dp[i][j-1])
5+
# 状态方程理解:由于在有限石子堆中双方都要取最优,当前玩家1取piles[i]或piles[j]时,则上一步反过来代表玩家2取到最优即dp[i+1][j]或dp[i][j-1],故要相减
56
class Solution(object):
67
def stoneGame(self, piles):
7-
dp = [[0]*len(piles) for _ in range(len(piles))]
8+
n = len(piles)
9+
dp = [[0]*n for _ in range(n)]
810
# 初始化只有一个石头堆的情况
9-
for i in range(len(piles)):
11+
for i in range(n):
1012
dp[i][i] = piles[i]
1113
# 每增加一个石头堆,则计算当前石头堆两个到n个的情况
12-
for i in range(len(piles)-2, -1, -1):
13-
for j in range(i+1, len(piles)):
14+
for i in range(n-2, -1, -1):
15+
for j in range(i+1, n):
1416
dp[i][j] = max(piles[i] - dp[i+1][j], piles[j] - dp[i][j-1])
1517
return dp[0][-1] > 0
16-
17-
18-
class Solution2(object):
19-
def stoneGame(self, piles):
20-
dp = [[0]*len(piles) for _ in range(len(piles))]
21-
for i in range(len(piles)):
22-
dp[i][i] = piles[i]
23-
# 依次计算相邻两个石头堆到n个石头堆的情况
24-
for i in range(1, len(piles)):
25-
for j in range(len(piles)-i):
26-
dp[j][j+i] = max(piles[j] - dp[j+1][j+i], piles[j+i] - dp[j][j+i-1])
27-
return dp[0][-1] > 0
18+
# 5 1 4 1
19+
# 0 4 1 4
20+
# 0 0 3 2
21+
# 0 0 0 5

0 commit comments

Comments
 (0)