原题链接:
https://leetcode.cn/problems/stone-game/description/
完成情况:
解题思路:
在这段代码中,定义了一个名为stoneGame的方法,接受一个整型数组piles作为参数。游戏规则是两个玩家轮流从石堆的开头或结尾取走整堆石头,直到所有石头被取完。游戏的胜负由谁手中的石子最多来决定,因为石子的总数是奇数,所以不会有平局。
在这个游戏中,Alice先开始。代码中通过动态规划的方式判断Alice是否一定会赢得这个游戏,最后返回一个布尔值来表示结果。
因此,这段代码的作用是判断Alice是否一定会赢得这个石子游戏。
参考代码:
_877石子游戏_记忆化递归_二维dp
package leetcode板块;
import java.util.Map;
public class _877石子游戏_记忆化递归_二维dp {
/**
* 一共有【偶数】堆石子,排成一行;每堆都有 正 整数颗石子,数目为 piles[i] 。
* @param piles
* @return
*/
public boolean stoneGame(int[] piles) {
//游戏以谁手中的石子最多来决出胜负。石子的 总数 是 奇数 ,所以没有平局。
/*
Alice 先开始
玩家从行的 开始 或 结束 处取走整堆石头
每回合,玩家从行的 开始 或 结束 处取走整堆石头。
只能怼着相邻的取,那么就检测dp[][] 附近的是否为负值,即可。
请问?
Alice是否一定赢?
*/
int lenPiles = piles.length;
int [][] dp_stoneGame = new int[lenPiles][lenPiles];
for (int i = 0;i<lenPiles;i++){
dp_stoneGame[i][i] = piles[i];
}
for (int i = lenPiles - 2;i>=0;i--){
for (int j = i+1;j<lenPiles;j++){
dp_stoneGame[i][j] = Math.max(piles[i] - dp_stoneGame[i+1][j],piles[j] - dp_stoneGame[i][j-1]);
}
}
return dp_stoneGame[0][lenPiles - 1] > 0;
}
}
_877石子游戏_记忆化递归_一维压缩
package leetcode板块;
import java.util.Map;
public class _877石子游戏_记忆化递归_一维压缩 {
/**
*
* @param piles
* @return
*/
public boolean stoneGame(int[] piles){
int lenPiles = piles.length;
int [] dp_stoneGame = new int[lenPiles];
for(int i = 0; i < lenPiles; i++){
dp_stoneGame[i] = piles[i];
}
//---------------------------------------------------
for(int i = lenPiles - 2; i >= 0; i--){
for (int j = i+1;j<lenPiles;j++){
dp_stoneGame[j] = Math.max(piles[i] - dp_stoneGame[j],piles[j] - dp_stoneGame[j-1]);
}
}
return dp_stoneGame[lenPiles - 1] > 0;
}
}