这类问题可以用递归来解决。核心思想就是使用哪一种选择来使自己成功。
决定使用哪种选择是使用max函数判断两种选择方式哪一个更棒。(min函数是对于另一个人来说的最优选择)
关键点在于抽象地使用递归这一方法。对于每次递归,我们的目的是查看哪一个更优,至于如何计算后续的结果,交给计算机即可。
自己的问题在于忘记了两个人都需要自己的每一步最优!
class Solution {
public:
int choose(vector<int>& nums,int left,int right){
//表示无人可选
if (left>right) return 0;
//分两种情况,偶数的人选和奇数的人选,注意由于结果计算的是差值,所以奇数的人找的是最小值!
if ((right-left)%2==0){
return max(nums[left]+choose(nums,left+1,right),nums[right]+choose(nums,left,right-1));
}
else{
return min(-nums[left]+choose(nums,left+1,right),-nums[right]+choose(nums,left,right-1));
}
}
bool PredictTheWinner(vector<int>& nums) {
if(nums.size()%2!=0) return choose(nums,0,nums.size()-1)>=0;
else return choose(nums,0,nums.size()-1)<=0;
}
};