486. Predict the Winner

Given an array of scores that are non-negative integers. Player 1 picks one of the numbers from either end of the array followed by the player 2 and then player 1 and so on. Each time a player picks a number, that number will not be available for the next player. This continues until all the scores have been chosen. The player with the maximum score wins.
Given an array of scores, predict whether player 1 is the winner. You can assume each player plays to maximize his score.
就是2个player轮流取一个数组两端的数,博弈,看谁最终SUM最大就赢了。给定一个字符串,判断player1能不能赢。
Example 1:

Input: [1, 5, 2]
Output: False
Explanation: Initially, player 1 can choose between 1 and 2.
If he chooses 2 (or 1), then player 2 can choose from 1 (or 2) and 5. If player 2 chooses 5, then player 1 will be left with 1 (or 2).
So, final score of player 1 is 1 + 2 = 3, and player 2 is 5.
Hence, player 1 will never be the winner and you need to return False.

Example 2:

Input: [1, 5, 233, 7]
Output: True
Explanation: Player 1 first chooses 1. Then player 2 have to choose between 5 and 7. No matter which number player 2 choose, player 1 can choose 233.
Finally, player 1 has more score (234) than player 2 (12), so you need to return True representing player1 can win.

Note:

  1. 1 <= length of the array <= 20.
  2. Any scores in the given array are non-negative integers and will not exceed 10,000,000.
  3. If the scores of both players are equal, then player 1 is still the winner.

思路

存在博弈,最优解/次优解所以是动态规划。
本题难点是找到递推方程,dp[i][j]是每次第一个人可以赢的差值。
所以
Your input

[1,5,2]
[1,5,233,7]
[1,5,233,7,9]

Your stdout

1, 4, -2, 
0, 5, 3, 
0, 0, 2, 

1, 4, 229, 222, 
0, 5, 228, -221, 
0, 0, 233, 226, 
0, 0, 0, 7, 

1, 4, 229, 222, -213, 
0, 5, 228, -221, 230, 
0, 0, 233, 226, 231, 
0, 0, 0, 7, 2, 
0, 0, 0, 0, 9, 

可以看出,

每个dp[i][j] = max(字符串左端nums[i] - dp表下面值, 字符串右端nums[j] - dp表左面值)

代码

class Solution {
    public boolean PredictTheWinner(int[] nums) {
        if(nums==null || nums.length==0) return true;
        int n = nums.length;
        int[][] dp=new int[n][n];
        for(int i=n-1;i>=0;i--){
            dp[i][i]=nums[i];
            for(int j=i+1;j<n;j++){
                dp[i][j] = Math.max(nums[i]-dp[i+1][j],nums[j]-dp[i][j-1]);
            }
        }
        /*
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                System.out.print(dp[i][j]+ ", ");
            }
            System.out.println();
        }
        */
        return dp[0][n-1]>=0;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 13,493评论 0 23
  • 房地产众筹模式可以多样化,因为房地产所关联的行业众多,所以房地产项目众筹设计可以与各个关联性上下游关系进行对接,尤...
    13899倪同山阅读 1,666评论 0 1
  • 小时候觉得日子过得慢啊 所有属于童年的记忆 几乎都是与淘气和吃有关...... 那时候的小园是在奶奶家的...
    许慕樵阅读 3,843评论 0 3

友情链接更多精彩内容