usaco3.3.5 A Game

双人游戏问题  有如下一个双人游戏:N个正整数的序列放在一个游戏平台上,两个人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束,以最终的分多者为胜利。编写一个执行最优策略的程序,最优策略就是使得自己能在当前情况下得到最优策略。要求程序要始终为第二位玩家执行最优策略。 该题目的动态规划方程是: 设sum(s,t)为区间s,t中的数字和,gain(s,t)为按照最优策略能获得... 阅读详情

一 原题

A Game
IOI'96 - Day 1

Consider the following two-player game played with a sequence of N positive integers (2 <= N <= 100) laid onto a 1 x N game board. Player 1 starts the game. The players move alternately by selecting a number from either the left or the right end of the gameboar. That number is then deleted from the board, and its value is added to the score of the player who selected it. A player wins if his sum is greater than his opponents.

Write a program that implements the optimal strategy. The optimal strategy yields maximum points when playing against the "best possible" opponent. Your program must further implement an optimal strategy for player 2.

PROGRAM NAME: game1

INPUT FORMAT

Line 1:N, the size of the board
Line 2-etc:N integers in the range (1..200) that are the contents of the game board, from left to right

SAMPLE INPUT (file game1.in)

6
4 7 2 9
5 2

OUTPUT FORMAT

Two space-separated integers on a line: the score of Player 1 followed by the score of Player 2.

SAMPLE OUTPUT (file game1.out)

18 11


二 分析

动态规划。dp[i][j]表示在区间[i, j]内先手能获得的最高分数。


三 代码

运行结果:
USER: Qi Shen [maxkibb3]
TASK: game1
LANG: C++

Compiling...
Compile: OK

Executing...
   Test 1: TEST OK [0.000 secs, 4264 KB]
   Test 2: TEST OK [0.000 secs, 4264 KB]
   Test 3: TEST OK [0.000 secs, 4264 KB]
   Test 4: TEST OK [0.000 secs, 4264 KB]
   Test 5: TEST OK [0.000 secs, 4264 KB]
   Test 6: TEST OK [0.000 secs, 4264 KB]
   Test 7: TEST OK [0.000 secs, 4264 KB]
   Test 8: TEST OK [0.000 secs, 4264 KB]
   Test 9: TEST OK [0.000 secs, 4264 KB]
   Test 10: TEST OK [0.000 secs, 4264 KB]
   Test 11: TEST OK [0.000 secs, 4264 KB]
   Test 12: TEST OK [0.000 secs, 4264 KB]
   Test 13: TEST OK [0.000 secs, 4264 KB]
   Test 14: TEST OK [0.000 secs, 4264 KB]
   Test 15: TEST OK [0.000 secs, 4264 KB]
   Test 16: TEST OK [0.000 secs, 4264 KB]

All tests OK.

Your program ('game1') produced all correct answers! This is your submission #2 for this problem. Congratulations!


AC代码:
/*
ID:maxkibb3
LANG:C++
PROG:game1
*/

#include<cstdio>
#include<algorithm>
using namespace std;

const int MAXN = 105;

int n;
int a[MAXN];
int sum[MAXN][MAXN];
int dp[MAXN][MAXN];

int main() {
    freopen("game1.in", "r", stdin);
    freopen("game1.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
        sum[i][i] = a[i];
        dp[i][i] = a[i];
    }
    for(int i = 0; i < n; i++) {
        for(int j = i + 1; j < n; j++) {
            sum[i][j] = sum[i][j - 1];
            sum[i][j] += a[j];
        }
    }
    for(int i = 1; i < n; i++) {
        for(int j = 0; j < n - i; j++) {
            dp[j][j + i] = max(a[j] + sum[j + 1][j + i] - dp[j + 1][j + i],
                           a[j + i] + sum[j][j + i - 1] - dp[j][j + i - 1]);
        }
    }
    printf("%d %d\n", dp[0][n - 1], sum[0][n - 1] - dp[0][n - 1]);
    return 0;
}


取数对弈(算法) 取数对弈游戏问题: 取数游戏是一个 2 人对策游戏。游戏开始时将 n 个数在棋盘上从左到右排成一行。 甲乙双方轮流在这一行数的左右两端取数,直至全部取完 n 个数。每人所取得的数的总和为其得分值。 最后双方得分多者获胜。(游戏规定由甲方先取数。) 这里,甲乙双方都采用如下最优策略: 1)甲每次取都希望取到的这个数使自己得分最高 2)乙每次取都希望取到的这个数令甲的得分最低 请编程实现:在甲乙双方都采用最优策略的前提下,计算甲方先取数时双方的最后得分。 输入格式 对于每组输入数据,输入数据的第 1 行有 1 个正整数 n (1<=n<=100),表示有 n 个数在棋盘上从左到右排成一行。 接下来的 n 个数表示在棋盘上依次排列的 n 个数。 输出格式 在甲乙双方都采用最优策略的前提下,输出计算出的双方的最后得分。甲方得分在前,乙方得分在后。 输入样例 6 4 7 2 9 5 2 输出样例 18 11 立即下载

相关推荐

UniApp实战:5分钟搞定后台持续定位与轨迹实时更新(附完整代码)

本文详细介绍了在UniApp中实现后台持续定位与动态轨迹地图系统的完整方案。针对物流配送、运动健身等场景,文章深入讲解了权限申请、坐标系选择、定位防抖优化、地图轨迹线(polyline)实时绘制等核心步骤,并提供了可复用的完整代码,帮助开发者高效解决App切后台定位停止、轨迹漂移等常见难题。

weixin_29266679的博客 483

【USACO3.3.5】A Game游戏 IOI‘96

动规

C789788的博客 257

用AI助手Cursor轻松自动生成流程图

通过 Cursor + Mermaid,我们可以快速、准确地自动生成流程图,上面演示的例子部分流程图可能比较丑,我们可以通过流程图软件导入Mermaid代码,然后手动进行微调就可以了,如果你对美观要求不是特别多,可以直接用,这将极大地提升代码可视化和架构设计的效率。

呱牛 Just do IT 1940

NKOJ P1835 【USACO3.3.5】A Game游戏 IOI‘96

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

jvruo_shabi的博客 484

10xGenomics官方可视化工具——Loupe Browser

Loupe Browser是⼀款10xGenomics开发的交互式桌⾯应⽤程序,⽤于探索10x单细胞数据,可以用来找出感兴趣的细胞、找出显著差异表达的基因、鉴定细胞类型、探索细胞亚类和数据共享。

weixin_47195452的博客 3359

从想法到零件:手把手拆解一个汽车功能如何从PRD写到SSTS和CTS

本文详细拆解了汽车电子需求从市场文档(MRD)到零部件技术规范(CTS)的完整流程,以雨天自动关窗功能为例,展示了PRD、SSTS和CTS的编写要点与交互设计。文章重点解析了系统分解的艺术和零部件落地的精确参数要求,为汽车电子工程师提供了从概念到实现的全流程实践指南。

weixin_30300225的博客 481

博弈论之双人取数游戏详解

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

Lynn_coder的博客 7212

Java实战:绿盾加密文件批量解密工具Ldterm的实现与优化

本文详细介绍了基于Java开发的绿盾加密文件批量解密工具Ldterm的实现与优化过程。通过分析绿盾加密机制,结合Java流处理能力,实现了高效的文件解密方案,并分享了多线程处理、内存优化等性能提升技巧,适用于企业级数据迁移与备份场景。

weixin_29314405的博客 492

USACO 3.3.5

<br />博弈问题,可以使用dp解决.<br />f[i][j] = s[i][j] - min{f[i+1][j], f[i][j-1]}<br />s[i][j]表示从i加到j的和, 枚举l=j-i.<br /><br />Executing...<br />   Test 1: TEST OK [0.011 secs, 3108 KB]<br />   Test 2: TEST OK [0.011 secs, 3108 KB]<br />   Test 3: TEST OK [0.011

Climber.pI的OI之路 471

使用 Python 爬虫抓取 IMDb 电影信息 - 评分、评论与基本信息抓取教程

本文介绍了如何使用 Python 爬虫技术抓取 IMDb 电影评分、评论和基本信息。我们分别展示了通过IMDb API和两种方法抓取数据,并进行了数据存储、分析与可视化。在未来,我们还可以基于这些数据开发电影推荐系统、情感分析工具等,进一步丰富电影数据的应用场景。通过这些实践,您不仅学会了如何抓取和存储数据,还可以通过这些基础来构建自己的数据分析应用,获取更丰富的电影数据。

2201_76125261的博客 601

3️⃣ Coze工作流基础教学(2025年全新版本)

Coze 工作流作为扣子平台的重磅工具,利用可视化节点,如大语言模型、插件、条件判断等,把复杂任务巧妙拆解成多步骤流程。它不仅支持自动化编排,还能实现跨系统协同,有效提升处理效率与输出稳定性。在那些对准确性或格式有严格要求的场景中,比如报告生成、旅行规划,Coze 工作流更是发挥着关键作用。

李同学Lino的博客 5856

【USACO题库】3.3.5 A Game游戏

题目大意: 求在一个序列里(1 样例输入: 6 4 7 2 9 5 2 样例输出: 18 11 解释: 两人依次选的是:2,4,7,5,9,2 第一个人=2+7+9=18 第二个人=4+5+2=11 这道题实质上是一道动态规划类题目,因为两人所选的策略都是最优策略,并不是一个贪心策略。所以,我们可以想到把一个序列来分段,也就是当前两人分别在取的序列的开

Hello,I'm Proking. 1364

项目实战第四十七讲:易宝支付对接详解(保姆级教程)

本文是项目实战第四十七讲,易宝支付对接详解。1、xxl_job 接入fix;2、支付接口,将thirdOrderNo赋初始值,并将数据库中third_Order_No设置为非空;3、性能提效:将深拷贝改为字符赋值,提升程序性能;先不改动。

Jet_qi的博客 2680

USACO 3.3.5 A Game 游戏

USACO 3.3.5 游戏

善良的小乔的博客 239

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python——【USACO 3.3.5】——A Game

A Game IOI'96 - Day 1 Consider the following two-player game played with a sequence of N positive integers (2 <= N <= 100) laid onto a 1 x N game board. Player 1 starts the game. The players move al

McDonnell_Douglas的博客 606

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

USACO3.3.5 A Game (game1)

状态:dp[l][r]:序列还剩[l,r]时先手取的最大得分 则现在有两种选择:取l和取r。 若取l,下一步换另一个人取的最大得分为dp[l+1][r],所以这一步的最大得分dp[l][r]=sum[l,r]-dp[l+1][r] 若取r同理。即dp[l][r] = max(sum[l,r]-dp[l + 1][r], sum[l][r]-dp[l][r+1]);/* ID:shijiey1

Shion的专栏 738

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

[USACO3.3.5]A Game

A Game IOI'96 - Day 1 Consider the following two-player game played with a sequence of N positive integers (2 <= N <= 100) laid onto a 1 x N game board. Player 1 starts the game. The players move al

qq_37665716的博客 469

Cpp环境【USACO3.3.5】【CQYZOS1256】A Game 游戏

【问题描述】   有如下一个双人游戏:   N个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。以最终得分多者为胜。   编一个执行最优策略的程序,最优策略就是使自己能得到在当前情况下最大的可能的总分的策略。你的程序要始终为两位玩家执行最优策略。【输入格式】 第一行: 正整数N, 表示序列中正整数

天地皆逆旅,你我本行人。 593

A Game (game1)[USACO 3.3.5]

看不懂啊,貌似用到了博弈论的知识,还是太弱了……{ ID:lstlst12 PROG:game1 LANG:PASCAL } program game1; var n:longint; f,sum:array [-1..100,-1..100] of longint; a

175

动规——【USACO3.3.5】A Game游戏 IOI'96

Description 有如下一个双人游戏:N(2 编一个执行最优策略的程序,最优策略就是使玩家在与最好的对手对弈时,能得到的在当前情况下最大的可能的总分的策略。你的程序要始终为第二位玩家执行最优策略。  状态:f[i][j]表示第i个数到第j个数先手可以获得的最大得分。 决策:先手可以取第i个数,那么剩下的i+1到j个数就等价于后手的情况,反之亦然。 代码如下: #includ

INCINCIBLE的博客 1217

A Game (game1)[USACO 3.3.5] 题解

{ ID:lstlst12 PROG:game1 LANG:PASCAL } program game1; var n:longint; f,sum:array [-1..100,-1..100] of longint; a:array [0..100] of longi

132

A Game (game1)[USACO 3.3.5] 代码

{ ID:lstlst12 PROG:game1 LANG:PASCAL } program game1; var n:longint; f,sum:array [-1..100,-1..100] of longint; a:array [0..100] of longi

234

A Game (game1)[USACO 3.3.5]解题报告

{ ID:lstlst12 PROG:game1 LANG:PASCAL } program game1; var n:longint; f,sum:array [-1..100,-1..100] of longint;//sum[i,j]表示从i到j这段范围内的数字总和,

185

USACO Section 3.3 A Game pascal

描述 Description 有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。以最终得分多者为胜。 编一个执行最优策略的程序,最优策略就是使自己能得到在当前情况下最大的可能的总分的策略。你的程序要始终为第二位玩家执行最优策略。 输入格式 Input

叫我小雷雷就好 1380
上一篇: usaco3.3.3 Camelot
下一篇: usaco3.4.1 American Heritage
max_kibble
博客等级 码龄11年 2粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值