蓝桥集训之游戏
-
核心思想:博弈论 + 区间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)
-
#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; }