给定一个数组,两个人A、B依次从数组最左端选择一个或者两个数字,最后选择的数字之和较大者赢。假设两个人都足够聪明,A先选,给定数组,判断A、B谁能赢。
分析:
给定Array[0]…Array[n]。
dp[i]表示当前数组为Array[i]…Array[n]时,当前选择的人最多能从数组中选出多少值。
使用sum[i] = Array[i]+….+Array[n]。
则
dp[i]=max⎧⎩⎨sum[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;
}