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赢
2
2
# 子问题:dp[i+1][j]和dp[i][j-1]
3
3
# 初始状态:dp的初始状态是i=j即只有一个石子堆,由于玩家1先拿,则dp[i][j]=piles[i]
4
4
# 状态方程: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],故要相减
5
6
class Solution (object ):
6
7
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 )]
8
10
# 初始化只有一个石头堆的情况
9
- for i in range (len ( piles ) ):
11
+ for i in range (n ):
10
12
dp [i ][i ] = piles [i ]
11
13
# 每增加一个石头堆,则计算当前石头堆两个到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 ):
14
16
dp [i ][j ] = max (piles [i ] - dp [i + 1 ][j ], piles [j ] - dp [i ][j - 1 ])
15
17
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