【算法题】博弈论:数组选数字

来源:互联网 发布:linux 重新安装lnmp 编辑:程序博客网 时间:2024/06/05 10:26

给定一个数组,两个人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;}

原创粉丝点击