基本递归思想,假设A要赢得最后的游戏,则要保证A从左边或右边抽有一个能赢就可以了,用||判断;B要保证A赢,那么需要他从左边和右边抽都保证A赢。用&&判断。
C++ 代码
class Solution {
public:
int s1=0,s2=0;
// 左边界 右边界 A的分数 B的分数 轮到谁抽 nums数组
bool dfs(int l,int r,int s1,int s2,char c,vector<int>& nums)
{
if(l>r) return s1>=s2;
if(c=='A')
// || A只要1种情况赢就可以了
return dfs(l+1,r,s1+nums[l],s2,'B',nums) || dfs(l,r-1,s1+nums[r],s2,'B',nums);
else
// && 同时满足A赢才可以
return dfs(l+1,r,s1,nums[l]+s2,'A',nums) && dfs(l,r-1,s1,nums[r]+s2,'A',nums);
}
bool PredictTheWinner(vector<int>& nums) {
if(nums.size()<=1) return true;
int l=0,r=nums.size()-1;
return dfs(l,r,s1,s2,'A',nums);
}
};
绝了,大佬牛啊,通俗易懂,非常完美的dfs,膜拜orz!!!!!!!为你打call。