1. 程式人生 > >動態規劃-Predict the Winner

動態規劃-Predict the Winner

his rom output XP har == 動態規劃 IT you

2018-04-22 19:19:47

問題描述:

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.

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.

問題求解:

首先我們如果窮舉的話,是會出現重疊子問題的,比如A選left,B選left,A選right,B選right等同於A選right,B選right,A選left,B選left。因此適用於動態規劃的方法來解決。現在問題就是如何建立這樣的一個遞推關系式。這條題目的動態規劃建立是比較trick的,因此這裏做一個介紹。

dp[i][j]:保存的是先手玩家A在i-j之間能獲得的做高分數與後手玩家B的最高分數的差值。

初始條件:i == j時,dp[i][j] = nums[i],這也對應著長度為一的情況。

遞推關系式:dp[i][j] = Math.max(nums[i] - dp[i + 1][j], nums[j] - dp[i][j - 1]),也就是說,對於當前的先手玩家,他既可以選擇前面一個數,也可以選擇後面一個數,那麽後手玩家的範圍就因此減少了,由於存儲的是差值,因此可以得到上述的遞推式。

    public boolean PredictTheWinner(int[] nums) {
        int n = nums.length;
        int[][] dp = new int[n][n];
        for (int i = 0; i < n; i++) dp[i][i] = nums[i];
        for (int len = 2; len <= n; len++) {
            for (int i = 0; i <= n - len; i++) {
                int j = i + len - 1;
                dp[i][j] = Math.max(nums[i] - dp[i + 1][j], nums[j] - dp[i][j - 1]);
            }
        }
        return dp[0][n - 1] >= 0;
    }

動態規劃-Predict the Winner