zoukankan      html  css  js  c++  java
  • [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;
    }
    
    
  • 相关阅读:
    13 数据库主从
    12 数据备份
    11 锁机制
    12 日志
    10 索引(二)
    09 索引
    update kernel 3.10-3.12
    haproxy para config
    mysql slave to master
    storage disk
  • 原文地址:https://www.cnblogs.com/mollnn/p/12449943.html
Copyright © 2011-2022 走看看