难度中等
亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i]
。
游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。
亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。
假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true
,当李赢得比赛时返回 false
。
思路:
采用动态规划的方式:
根据题意可以知道胜负由各人最终拥有的石子数量来决定,可以将俩个人拥有的石子数量问题转换为当人最后拥有的石子数量的正负问题。
第一次该玩家获得石子,下一次该玩家失去石子。且每次仅能从头或者尾部获得/失去石子。
令 F(i) 表示最后能剩余的石子数。
转换方程: F(i) = max ( P(i) - F(i) , P(j) - F(j-1) )
代码:
bool stoneGame(vector<int>& piles) {
int len = piles.size();
vector<int> dp(piles);
for(int i=len-2;i>=0;--i){
for(int j = i + 1; j < len; ++j){
dp[j] = max( piles[i]-dp[j], piles[j] - dp[j - 1] );
}
}
return dp[len - 1] > 0;
}