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],故要相减
56class 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