486.预测赢家

给定一个表示分数的非负整数数组。 玩家 1 从数组任意一端拿取一个分数,随后玩家 2 继续从剩余数组任意一端拿取分数,然后玩家 1 拿,…… 。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。
给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。

class Solution {
    public boolean PredictTheWinner(int[] nums) {
        return total(nums,0,nums.length-1,1)>=0;
    }
    

    /* 递归  
     *1.每次只能拿数组的第一个/最后一个
     *2.int一个标记turn   1表示为先手,-1为后手 即先手拿分数记录下的为正后手为负
     *3.求和,return>=0 先手即获胜
     */
    public int total(int[] nums,int start,int end,int turn){
        if(start==end)
            return nums[start];
        int score1 = nums[start]*turn+total(nums,start+1,end,-turn);
        int score2 = nums[end]*turn+total(nums,start,end-1,-turn);
        return Math.max(score1*turn,score2*turn)*turn;
    }
}
posted @ 2020-09-01 15:33  _zjk  阅读(128)  评论(0)    收藏  举报