/**
* 877. 石子游戏
*
* 数学解法更加巧妙,但是通用性不强,此处只写动态规划做法
*
* 动态规划
* 1 每次从开头或者结尾取出石子,证明无论怎么取,剩余的石子一定是连续的
* 2 限制条件:两个人所得石子的数目的差值
* 3
* 如果第一人先从左边取值, 则另一人必须从 [i + 1, j] 处获取石子,
* 其二人获取石子的差值是 p[i] - dp[i + 1][j]
* 如果第一个人从右边取值,则另一个人只能从 [i, j - 1]
* 其二人获取石子的差值是 p[j] - dp[i + 1][j]
* 两个人的最佳状态转移方程为 dp = max(p[i] - dp[i + 1][j], p[j] - dp[i][j - 1])
*
* 当 i == j 特殊情况,最后一堆石子,此时轮到谁谁拿走,dp[i][j] = p[i], 没有其余最优解
*
* 当 i > j 没有石子,dp[i][j] = 0
*
*/
public class Solution877 {
public boolean stoneGame(int[] piles) {
int len = piles.length;
int[][] dp = new int[len][len];
for (int i = 0; i < len; i++) {
dp[i][i] = piles[i];
}
for (int i = len - 2; i >= 0; i--) {
for (int j = i + 1; j <= len - 1; j++){
dp[i][j] = Math.max(piles[i] - dp[i + 1][j], piles[j] - dp[i][j - 1]);
}
}
return dp[0][len - 1] > 0;
}
}
LeetCode -- 877. 石子游戏
最新推荐文章于 2022-04-04 21:51:22 发布