题目描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5020b3c16eb9c0d58845509b2227ae1a.png)
思路
- 先手必胜,直接返回true
- 或者用动态规划思想
- dp[i][j]意思为当剩下的石子堆为i至j时,当前玩家与另一个玩家的石子数量之差的最大值
- i<=j时 dp数组才有意义,故i>j时的dp[i][j]均为0
- i=j时,只剩下这一堆石子了,故dp[i][i]=piles[i];
- 状态转移方程为dp[i][j] = max(piles[i]-dp[i+1][j],piles[j]-dp[i][j-1])
代码
class Solution {
public boolean stoneGame(int[] piles) {
int length = piles.length;
int[][] dp = new int[length][length];
for (int i = 0; i < length; i++) {
dp[i][i] = piles[i];
}
for (int i = length - 2; i >= 0; i--) {
for (int j = i + 1; j < length; j++) {
dp[i][j] = Math.max(piles[i] - dp[i + 1][j], piles[j] - dp[i][j - 1]);
}
}
return dp[0][length - 1] > 0;
}
}