蓝桥集训之游戏
-
核心思想:博弈论 + 区间dp
-
设玩家1的最优解为A 玩家2的最优解为B
- 1的目标就是使A-B最大 2的目标就是使B-A最大
-
当玩家1取L左端点 时 右边子区间结果就是玩家2的最优解B-A
- 即当前结果为w[L] -- (B-A)
-
当玩家1取R右端点 时 左边子区间结果就是玩家2的最优解B-A
- 即当前结果为w[R] -- (B-A)
cpp
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int w[N];
int f[N][N];
int n;
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>w[i];
for(int len = 1;len<=n;len++) //区间dp
{
for(int i=0;i+len-1<n;i++)
{
int j = i+len-1; //i左端点 j右端点
//右子区间结果为f[i+1][j] , 左子区间结果为f[i][j-1];
f[i][j] = max(w[i] - f[i+1][j] , w[j] - f[i][j-1]);
}
}
int sum = 0,d = f[0][n-1]; //A+B-sum , A-B=f[0][n-1] 联立求解AB
for(int i=0;i<n;i++) sum+=w[i];
cout<<(sum+d)/2<<" "<<(sum-d)/2<<endl;
return 0;
}