396. 硬币排成线 III

2019-05-23  本文已影响0人  薄荷糖的味道_fb40

描述

n 个硬币排成一条线, 第 i 枚硬币的价值为 values[i].
两个参赛者轮流从任意一边取一枚硬币, 直到没有硬币为止. 拿到硬币总价值更高的获胜.
请判定 第一个玩家 会赢还是会输.

样例

样例 1:

输入: [3, 2, 2]
输出: true
解释: 第一个玩家在刚开始的时候拿走 3, 然后两个人分别拿到一枚 2.
样例 2:

输入: [1, 20, 4]
输出: false
解释: 无论第一个玩家在第一轮拿走 1 还是 4, 第二个玩家都可以拿到 20.

思路:

dp[i][j]代表ij区间内先手总获益与后手总获益的插值,则
dp[i][j]=max(-dp[i+1][j]+values[i],-dp[i][j-1]+values[j])
代表了拿走最左和最右分别获益的最大值。具体实现如下。

class Solution {
public:
    /**
     * @param values: a vector of integers
     * @return: a boolean which equals to true if the first player will win
     */
    bool firstWillWin(vector<int> &values) {
        // write your code here
        int n=values.size();
        if(!n)
        {
            return 0;
        }
        vector<vector<int>> dp(n,vector<int>(n,0));
        for(int i=0;i<n;i++)
        {
            dp[i][i]=values[i];
        }
        for(int len=2;len<=n;len++)
        {
            for(int i=0;i<=n-len;i++)
            {
                int j=i+len-1;
                dp[i][j]=max(-dp[i+1][j]+values[i],-dp[i][j-1]+values[j]);
            }
        }
        return dp[0][n-1]>0?true:false;
    }
};
上一篇 下一篇

猜你喜欢

热点阅读