蓝桥集训之游戏
-
核心思想:博弈论 + 区间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] 联立求解ABfor(int i=0;i<n;i++) sum+=w[i];cout<<(sum+d)/2<<" "<<(sum-d)/2<<endl;return 0;}