【面試題 & LeetCode 486】Predict the Winner

題目描述

一個整數數組,兩個人一次分別從左邊或者右邊拿走一個數,兩個人足夠聰明,求第一個人拿到數的最大和。

動態規劃

dp[i][j]表示該區間先手能取到的最大和。從小區間到大區間更新。

代碼

class Solution {
public:
    bool PredictTheWinner(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> dp(n, vector<int>(n, 0));
        for (int i=0; i<n; ++i) {
            dp[i][i] = nums[i];
        }
        
        vector<int> sum(n, 0);
        sum[0] = nums[0];
        for (int i=1; i<n; ++i) sum[i] = sum[i-1] + nums[i];
       
        for (int l=2; l<=n; ++l) {
            for (int i=0, j=i+l-1; j<n; ++i, ++j) {
                dp[i][j] = max(nums[i] + sum[j] - sum[i] - dp[i+1][j], nums[j] + sum[j-1] - (i == 0 ? 0 : sum[i-1]) - dp[i][j-1]);
            }
        }
        
        int res = dp[0][n-1];
        return (res*2 >= sum[n-1] ? true : false);
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章