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;
    }
  • 相关阅读:
    hdu 5253 最小生成树
    hdu5248 序列变换
    bjfu1299 stl使用
    bjfu1277 简单递归
    bjfu1262 优先队列
    bjfu1287字符串输出的大水题
    bjfu1281
    bjfu1253 最大上升子序列和
    [转][Unity3D]引擎崩溃、异常、警告、BUG与提示总结及解决方法
    Unity3d 中 将远程 MySQL 数据库转换为本地 Sqlite
  • 原文地址:https://www.cnblogs.com/hrj1/p/11538081.html
Copyright © 2011-2022 走看看