1.トピック
ゲーム内のいくつかの石を持つアレックスとリー・ヒープ。偶数スタック列に配置された石は、各スタックは、[i]は、正の整数石片山を有しています。
誰が勝者を決定するための最も石でゲームを持っています。石の合計数には引き分けがない、奇妙です。
アレックスとリーはターンを取る、アレックスが最初に起動します。
各ターンでは、プレイヤーは、行の先頭や末尾から石の全体の杭を奪います。
この状況は、石の勝利の手のほとんどを、その時点でこれ以上の石の山、まで続きました。
アレックスがゲームに勝つときアレックス・リーの前提と最高レベルのプレーには、trueを返す、リーは試合に勝つためにはfalseを返します。
示例:
输入:[5,3,4,5]
输出:true
解释:
亚历克斯先开始,只能拿前 5 颗或后 5 颗石子 。
假设他取了前 5 颗,这一行就变成了 [3,4,5] 。
如果李拿走前 3 颗,那么剩下的是 [4,5],亚历克斯拿走后 5 颗赢得 10 分。
如果李拿走后 5 颗,那么剩下的是 [3,4],亚历克斯拿走后 4 颗赢得 9 分。
这表明,取前 5 颗石子对亚历克斯来说是一个胜利的举动,所以我们返回 true 。
提示:
2 <= piles.length <= 500
piles.length 是偶数。
1 <= piles[i] <= 500
sum(piles) 是奇数。
出典:滞在ボタン(LeetCode)
//leetcode-cn.com/problems/stone-game:リンク:httpsの
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。
2.問題解決
- 類似タイトル:LeetCode 5379.小石ゲームIII(DP)
2.1トリック
- あなたは常にすべての奇数またはすべての偶数のヒープヒープの上部の手を得ることができます
- 合計は、事前に、奇数服用している大きなヒープの数、あるいは大きな山を数えるか、勝つことができるOujiuを取る好奇心、奇数であります
class Solution {
public:
bool stoneGame(vector<int>& piles) {
return 1;
}
};
4 ms 8.6 MB
2.2 DP
class Solution {
public:
bool stoneGame(vector<int>& piles) {
int i, j, n = piles.size();
vector<vector<int>> dp(n,vector<int>(n,0));
for(i = 0; i < n; ++i)
dp[i][i] = piles[i];
//dp[i][j]表示区间[i,j]石子,Alice能拿到的 最大分差
for(int len = 1; len < n; ++len)//划分取小的区间间隔len【1,2】len=1
{
for(i = 0; i < n-len; ++i)
{
dp[i][i+len] = max(piles[i]-dp[i+1][i+len], piles[i+len]-dp[i][i+len-1]);
//我选取了左边 piles[i],减去对手在[i+1,i+len]上获取的最大值
//我选取了右边 piles[i+len],减去对手在[i,i+len-1]上获取的最大值
//取两种情况最大的
}
}
return dp[0][n-1] > 0;
}
};
0 1 2 3
例子 [5,50,3,4]
dp[0 1]=45 dp[1 2]=47 dp[2 3]=1 //len = 1
dp[0 2]=-42 dp[1 3]=49 //len = 2
dp[0 3]=46 //len = 3