zoukankan      html  css  js  c++  java
  • 【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进行转移,状态设计为区间中最大/最小得分

  • 相关阅读:
    PAT B1045 快速排序 (25 分)
    PAT B1042 字符统计 (20 分)
    PAT B1040 有几个PAT (25 分)
    PAT B1035 插入与归并 (25 分)
    PAT B1034 有理数四则运算 (20 分)
    PAT B1033 旧键盘打字 (20 分)
    HDU 1231 最大连续子序列
    HDU 1166 敌兵布阵
    HDU 1715 大菲波数
    HDU 1016 Prime Ring Problem
  • 原文地址:https://www.cnblogs.com/yifusuyi/p/9210064.html
Copyright © 2011-2022 走看看