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