LeetCode 877小石ゲーム(DP)

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.問題解決

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
公開された814元の記事 ウォンの賞賛1648 ビュー39万+

おすすめ

転載: blog.csdn.net/qq_21201267/article/details/105334918