【算法題】博弈論:數組選數字

給定一個數組,兩個人A、B依次從數組最左端選擇一個或者兩個數字,最後選擇的數字之和較大者贏。假設兩個人都足夠聰明,A先選,給定數組,判斷A、B誰能贏。

分析:

給定Array[0]…Array[n]。

dp[i]表示當前數組爲Array[i]…Array[n]時,當前選擇的人最多能從數組中選出多少值。

使用sum[i] = Array[i]+….+Array[n]。

dp[i]=maxsum[i]dp[i+1]sum[i]dp[i+2]

#include <vector>
#include <cstdio>
#include <numeric>
#include <iostream>
#include <algorithm>

using namespace std;

bool PredictTheWinner(vector<int>& nums)
{
    int n = nums.size();
    vector<int> sum(n+1,0);
    for (auto i = n - 1; i >= 0;--i)
        sum[i] = sum[i + 1] + nums[i];

    vector<int> dp(n);

    dp[n - 1] = sum[n - 1];
    dp[n - 2] = sum[n - 2];

    for (auto i = n - 3; i >= 0; --i)
    {
        dp[i] = max(dp[i], sum[i] - dp[i + 1]);
        dp[i] = max(dp[i], sum[i] - dp[i + 2]);
    }
    return sum[0] < 2*dp[0];
}

int main()
{
    vector<int>  vec{1,2,3,4,5,6};
    cout<<PredictTheWinner(vec)<<endl;
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章