給定一個數組,兩個人A、B依次從數組最左端選擇一個或者兩個數字,最後選擇的數字之和較大者贏。假設兩個人都足夠聰明,A先選,給定數組,判斷A、B誰能贏。
分析:
給定Array[0]…Array[n]。
dp[i]表示當前數組爲Array[i]…Array[n]時,當前選擇的人最多能從數組中選出多少值。
使用sum[i] = Array[i]+….+Array[n]。
則
#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;
}