Stone Game 二维dp

Alex and Lee play a game with piles of stones.  There are an even number of piles arranged in a row, and each pile has a positive integer number of stones piles[i].

The objective of the game is to end with the most stones.  The total number of stones is odd, so there are no ties.

Alex and Lee take turns, with Alex starting first.  Each turn, a player takes the entire pile of stones from either the beginning or the end of the row.  This continues until there are no more piles left, at which point the person with the most stones wins.

Assuming Alex and Lee play optimally, return True if and only if Alex wins the game.

 

Example 1:

Input: [5,3,4,5]
Output: true
Explanation: 
Alex starts first, and can only take the first 5 or the last 5.
Say he takes the first 5, so that the row becomes [3, 4, 5].
If Lee takes 3, then the board is [4, 5], and Alex takes 5 to win with 10 points.
If Lee takes the last 5, then the board is [3, 4], and Alex takes 4 to win with 9 points.
This demonstrated that taking the first 5 was a winning move for Alex, so we return true.
 

Note:

2 <= piles.length <= 500
piles.length is even.
1 <= piles[i] <= 500
sum(piles) is odd.

题意:共偶数堆石子,石子共奇数个,两人依次从最左或最右取走一堆,问最后谁多。
解法一:因为石子共奇数个,所以奇数堆或偶数堆有一个更大,而先手可以控制自己拿奇数或偶数堆,如先手只拿1,3,5,…堆,所以先手必胜。

class Solution {
public:
    bool stoneGame(vector& piles) {
        return true;
    }
};

解法二:上述做法只能保证先手必胜,但不一定赢得最多,也不能判断奇数堆的情况。
dp[i][j]表示 piles[i]~piles[j] 先手能赢的最大分数,则 dp[i][j] = max(piles[i] - dp[i + 1][j], piles[j] - dp[i][j - 1]),表示取第 i 或 j 堆,dp[i + 1][j] 表示 piles[i + 1]~piles[j] 先手所赢最大值,因为两人都会用最有方法来取,先手取第 i 堆的前一步,后手也是按照相同策略取的,所以是 piles[i] - dp[i + 1][j] 而不是加。

class Solution {
public:
    bool stoneGame(vector& piles) {
        int n = piles.size();
        int dp[n][n];
        for(int i = 0; i < n; ++i)
            dp[i][i] = piles[i];
        for(int d = 1; d < n; ++d)
            for(int i = 0; i < n - d; ++i)
                dp[i][i + d] = max(piles[i] - dp[i + 1][i + d], 
                                   piles[i + d] - dp[i][i + d - 1]);
        return dp[0][n - 1] > 0;
    }
};

你可能感兴趣的:(Leetcode,动态规划)