YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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即可。

posted on 2020-09-01 21:29  Target--fly  阅读(233)  评论(0编辑  收藏  举报