• 【DP】【P2734】游戏 A Game


    传送门

    Description

      有如下一个双人游戏:N个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的任意一端取一个数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。以最终得分多者为胜。编一个执行最优策略的程序,最优策略就是使玩家在与最好的对手对弈时,能得到的在当前情况下最大的可能的总分的策略。你的程序要始终为第二位玩家执行最优策略。

    Input

    第一行: 正整数N, 表示序列中正整数的个数。

    第二行至末尾: 用空格分隔的N个正整数(大小为1-200)。

    Output

    只有一行,用空格分隔的两个整数: 依次为玩家一和玩家二最终的得分。

    Sample Input

    6 
    4 7 2 9 5 2

    Sample Output

    18 11

    Hint

    2 <= N <= 100

    Solution

      计算型博弈论基础题。设f[l][r]为区间[l,r]的先手取数的最大得分,sum为前缀和,有状态转移方程:

          f[l][r]=max(s[r]-s[l-1]-f[l+1][r],s[r]-s[l-1]+f[l][r-1)=s[r]-s[l-1]-min(f[l+1][r],f[l][r-1])。

       注意到一个区间中的数要么被A区要么被B取,其总和不变,所以每个人的最优策略其实是让对手取最少的数。

    Code

    #include<cstdio>
    #define maxn 105
    
    inline void qr(int &x) {
        char ch=getchar();int f=1;
        while(ch>'9'||ch<'0')    {
            if(ch=='-')    f=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')    x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x*=f;
        return;
    }
    
    inline int max(const int &a,const int &b) {if(a>b) return a;else return b;}
    inline int min(const int &a,const int &b) {if(a<b) return a;else return b;}
    inline int abs(const int &x) {if(x>0) return x;else return -x;}
    
    inline void swap(int &a,int &b) {
        int c=a;a=b;b=c;return;
    }
    
    int n,sum[maxn],frog[maxn][maxn];
    
    int main() {
        qr(n);
        for(int i=1;i<=n;++i) {
            qr(frog[i][i]);sum[i]=sum[i-1]+frog[i][i];
        }
        for(int i=1;i^n;++i) {
            for(int l=1;l^n;++l) {
                int r=l+i;if(r>n)    break;
                int s=sum[r]-sum[l-1];
                frog[l][r]=s-min(frog[l+1][r],frog[l][r-1]);
            }
        }
        printf("%d %d
    ",frog[1][n],sum[n]-frog[1][n]);
        return 0;
    }

    Summary

      进行区间博弈论一般使用区间DP进行转移,状态设计为区间中最大/最小得分

  • 相关阅读:
    STM8s在利用库配置端口的小问题
    ABAP调试
    READ TABLE 的用法
    人在低谷
    力扣 两数之和
    未来选择
    选择
    室友问题该如何解决呢?
    力扣 两数之和
    谈谈自己
  • 原文地址:https://www.cnblogs.com/yifusuyi/p/9210064.html
Copyright © 2020-2023  润新知