石子游戏(Leetcode每日一题)

https://leetcode-cn.com/problems/stone-game/

定义状态数组:dp[i][j]表示还剩下i~~~j个石子时,当前选手和另一个选手的最大差值。

如果当前选手选第i个,dp[i][j]=nums[i] - dp[i+1][ j ],为什么是这样呢?假设当前选手A选择了第i堆石子,dp[i+1][j]表示的应该是选手B-选手A的石子,nums[i]-dp[i+1][j]就相当于nums[i]+选手A的石子-选手B的石子,就是他们的差值,如果选第j个的话,dp[i][j]=nums[j]-dp[i][j-1],然后取最大值就好了。

code:

class Solution {
public:
    int dp[30][30];
    bool PredictTheWinner(vector<int>& nums) {
        for(int i=0;i<nums.size();i++)  dp[i][i]=nums[i];
        for(int k=2;k<=nums.size();k++){
           for(int i=0;i+k-1<nums.size();i++){
               dp[i][i+k-1]=max(nums[i]-dp[i+1][i+k-1],nums[i+k-1]-dp[i][i+k-2]);
           }
        }
        return dp[0][nums.size()-1]>=0;
    }
};

 另外还有一个数学算法,但是文字太多了,看的很迷....如果是偶数堆石子的话,一定是先手赢,即直接return true即可。

原文地址:https://www.cnblogs.com/Accepting/p/13598703.html