[USACO3.3] A Game

有如下一个双人游戏: (N(2 leq N leq 100)) 个正整数的序列放在一个游戏平台上,游戏由玩家 (1) 开始,两人轮流从序列的任意一端取一个数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。以最终得分多者为胜。求最优策略下的玩家得分。

Solution

套路的博弈 DP,设 (f[i][j]) 表示区间 ([i,j]%) 内玩游戏得到的先手分数与后手分数的最大差,则

[f[i][j]=max(a[i]-f[i+1][j],a[j]-f[i][j-1]) ]

#include <bits/stdc++.h>
using namespace std;

const int N = 105;

int n,f[N][N],a[N],sum;

signed main() {
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i], sum+=a[i];
    for(int i=1;i<=n;i++) f[i][i]=a[i];
    for(int l=2;l<=n;l++) {
        for(int i=1;i+l-1<=n;i++) {
            int j=i+l-1;
            f[i][j]=max(a[i]-f[i+1][j],a[j]-f[i][j-1]);
        }
    }
    cout<<(sum+f[1][n])/2<<" "<<(sum-f[1][n])/2;
}

原文地址:https://www.cnblogs.com/mollnn/p/12449943.html