zoukankan      html  css  js  c++  java
  • P2734 游戏 A Game

    题目背景

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

    题目描述

    编一个执行最优策略的程序,最优策略就是使玩家在与最好的对手对弈时,能得到的在当前情况下最大的可能的总分的策略。你的程序要始终为第二位玩家执行最优策略。

    输入格式

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

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

    输出格式

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

    输入输出样例

    输入 #1
    6 
    4 7 2 9 5 2
    输出 #1
    18 11

    说明/提示

    题目翻译来自NOCOW。

    USACO Training Section 3.3

    是一道DP

    我记得好像在哪做过

    好像双向队列也能做。。。

    #include<cstdio>
    #include<iostream>
    using namespace std;
    
    inline int read(){
        int s=0,w=1;
        char ch=getchar();
        while(ch<'0'||ch>'9'){
            if(ch=='-'){
                w=-1;
            }
            ch=getchar();
        }
        while(ch>='0'&&ch<='9'){
            s=s*10+ch-'0';
            ch=getchar();
        }
        return s*w;
    }
    
    
    int n,t;
    
    int s[210],f[210][210];
    
    int main(){
        int i,j;
        n=read();
        for(i=1;i<=n;i++){
            t=read();
            s[i]=s[i-1]+t;
            f[i][i]=t;
        }
        for(i=n-1;i>=1;i--){ 
            for(j=i+1;j<=n;j++){ 
                f[i][j]=max((s[j]-s[i-1])-f[i][j-1],(s[j]-s[i-1])-f[i+1][j]);
            }
        }
        printf("%d %d
    ",f[1][n],s[n]-f[1][n]);
        return 0;
    }
  • 相关阅读:
    【洛谷习题】公路修建
    priority_queue用法简记
    【洛谷习题】无线通讯网
    【SCOI2005】繁忙的都市
    第四周 3.20-3.26
    第三周 3.13-3.19
    第二周 3.6-3.12
    第一周 2.28-3.5
    第六周 2.21-2.27
    2018湘潭邀请赛 AFK题解 其他待补...
  • 原文地址:https://www.cnblogs.com/hrj1/p/11538081.html
Copyright © 2011-2022 走看看