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

USACO 3.3 A Game 游戏 题目描述 题目意思是给你一个序列, 两个玩家, 每个玩家可以从序列的开头或者末尾取一个数,问两个玩家都采取最优策略,第一个玩家得分最多是多少?   样例输入&输出 sample input   6 4 7 2 9 5 2 sample output 18 11    分析&反思 明显是动态规划的题目,想到了以长度为阶段,但dp数组的意义没有把握好,应该... 阅读详情
【问题描述】  

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

【输入格式】  

第一行: 正整数N, 表示序列中正整数的个数。
第二行至末尾: 用空格分隔的N个正整数(大小为1-200)。

【输出格式】  

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

【输入样例】  

6
4 7 2 9 5 2

【输出样例】  

18 11

【数据范围】  

2 <= N <= 100

【传送矩阵】

重庆一中题库 1256 传送矩阵

【思路梳理】

  思考一下经典的一道区间型动态规划问题:

取数游戏:
  1、每次取数时须从取走一个元素,共取n次;
  2、每次取走的元素只能是当前序列的首或尾元素;
  3、每次取数都有一个得分值,取数的得分=被取走的元素值*2^i,其中i表示第i次取数(从1开始编号);
  4、游戏结束总得分为n次取数得分之和。

  两道题目有异曲同工之处,先从相同点入手:都是常规的动态规划的思路,思考从哪个状态转移过来。显然对于当前状态,我们可以取走当前区间的第一个数或者最后一个数,那么我们的状态转移函数仍然设计为:d[i][j]=在i~j个区间上进行取数时能够获得的最大分数值。
  现在问题在于差异处:两个人进行游戏。一种容易想到的思路是:将d[i][j]拓展一维变成d[i][j][k]=在第i~j个数中取数时,上一位玩家共取得的得分为k的情况下,当前玩家的分数。然而这样一来首先是空间复杂度非常高,再者时间复杂度也不能够接受。
  如此一来我们必须要思考两个玩家间取得得分的关系:在区间i~j中无论两位玩家采取怎么样的策略取数,都一定会有如下等式:sum[i][j]=甲玩家在i~j区间取数的分数值+乙玩家在i~j区间取数的分数值。那么由此一来我们可以设置一个可行的状态函数:
  

d[i][j]=先手玩家在第i个元素至第j个元素中进行取数时能够获得的最大值

  为了建立状态转移方程,我们需要思考当前状态d[i][j]如何转移过来。当前先手玩家甲只有唯二的选择,要么选择第i个数字,要么选择第j个数字。
  如果选择了第一个选择,那么就是由“在第i+1个数至第j个数后手取数(即乙玩家先手取数)所能够获得的最大分数”转移过来。两人都遵循的是最优策略,那么乙玩家所取得的分数是d[i+1][j](乙是先手玩家,在第i+1至第j个数中采用最优策略获得最大分数值)。
  根据我们上面推出的等式,可以得到甲在乙取数后所获得的分数是sum[i+1][j]-d[i+1][j],同时甲玩家在新的一轮作为先手玩家取走了第i个数字,那么t1=sum[i+1][j]-d[i+1][j]+a[i],同理可以得到t2=sum[i][j-1]-d[i][j-1]+a[j],然后d[i][j]=max(t1,t2),取走最优的答案。

【Cpp代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 105
#define inf 20005
using namespace std;
int n,a[maxn],d[maxn][maxn],sum[maxn][maxn];


void dp()
{
    //d[i][j]=在第i至第j个区间进行取数时,甲玩家能够获得的最大分数值
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)if(i!=j)   
        d[i][j]=-inf;
    else d[i][j]=a[i];

    //d[i][j]=max{ sum[i+1][j]-d[i+1][j],sum[i][j-1]-d[i][j-1]}

    for(int lens=2;lens<=n;lens++)
    for(int i=1;i<=n;i++)
    {
        int j=i+lens-1;
        if(j>n) break;
        int t1=sum[i+1][j]-d[i+1][j]+a[i],t2=sum[i][j-1]-d[i][j-1]+a[j];
        d[i][j]=max(t2,t1);
    }
    cout<<d[1][n]<<" "<<sum[1][n]-d[1][n];
}

int main()
{
//  freopen("in.txt","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)   scanf("%d",&a[i]);

    for(int i=1;i<=n;i++)
    for(int j=i;j<=n;j++)   sum[i][j]=sum[i][j-1]+a[j];//计算前缀和 
    dp();
    return 0;
}
动态规划习题(四)--USACO 3.3 A Game 题目如下:有如下一个双人游戏:N(2 &lt;= N &lt;= 100)个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。以最终得分多者为胜。编一个执行最优策略的程序,最优策略就是使自己能得到在当前情况下最大的可能的总分的策略。你的程序要始终为第二位玩家执行最优策略。PROGRAM NAME: game1INPUT FOR... 阅读详情

相关推荐

Cpp环境【POJ3045】【Vijos2982】Cow Acrobats 牛的杂技套路

Description 【问题描述】 Farmer John’s N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join the circus. Their hoofed feet prevent them from tightrope walking and swinging from the tra

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

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

动规

C789788的博客 257

Cpp环境【NOIP practice】【BSOJ1878】【Vijos1172】 山头狙击战

【问题描述】   Lucky为了掩护大部队,单枪匹马同敌人周旋,后来被敌人包围在某山头……等等,为什么怎么听怎么像狼牙山五壮士!不过不用着急,这次Lucky携带了足够的弹药,完全可以将涌上来的敌人一个一个干掉。Lucky是个神枪手,只要他的枪膛中有子弹,他就能将在他射程m(用从敌人位置到山头的直线距离算)以内的一个敌人瞬间射杀。但如果在射程内没有敌人,出于节约子弹考虑和面子问题,Lucky会等待

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

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

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

jvruo_shabi的博客 483

Android架构中UseCase的设计原则与实战解析

本文深入解析Android架构中UseCase的设计原则与实战应用,探讨其在Domain Layer中的核心作用。通过对比ViewModel的臃肿问题,详细阐述UseCase的无状态原则、单一职责边界等设计铁律,并提供多种实现方式的代码示例,帮助开发者构建更清晰、高效的Android应用架构。

weixin_28432777的博客 431

金融科技数据源

数字金融开放研究平台

平平淡淡,戒急用忍,一生学闭嘴。 1757

【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

【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)

在当今科技飞速发展的时代,人工智能(AI)已经成为各行各业不可或缺的一部分。特别是在文档处理和数据分析领域,AI的应用更是无处不在。今天,我要向大家介绍一个开源的AI框架引擎——RAGflow。它能够在深度文档理解方面执行检索增强生成(Retrieval-Augmented Generation,简称RAG),并且被认为是目前最优秀的RAG框架之一。本文将详细探讨RAGflow的创新功能、技术特点以及如何在实际应用中发挥其最大潜力。

Yooao的博客 9618

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

max_kibble的博客 472

银河麒麟arm64 V10 SP1桌面系统高效部署onnxruntime推理环境实战

本文详细介绍了在银河麒麟arm64 V10 SP1桌面系统上高效部署onnxruntime推理环境的完整实战流程。从系统环境准备、关键依赖安装,到onnxruntime的安装验证,并以YOLOv5模型部署为例进行性能对比分析,提供了在国产化飞腾D2000平台上进行AI边缘推理的实用指南和避坑技巧。

ss78901的博客 636

光学设计进阶:Zemax中的坐标断点与离轴系统优化

本文深入解析了Zemax中坐标断点的核心原理与实战应用,它是实现离轴光学系统设计的关键。文章通过比喻和实例,详细阐述了如何利用坐标断点作为“方向盘”来精确控制光学元件的偏心和倾斜,实现“前断后接”的局部坐标系变换,从而构建并优化无中心遮拦的离轴反射系统,避免光线失控。

3a9bq4r8t2y的博客 525

usaco 3.3 range 2008.11.7

usaco 3.3 range 2008.11.7 状态定义:G[i][j]为以(i,j)为左上角顶点的正方形的最大边长。 边界条件:G[i][j]为初始读入的矩阵。 状态转移方程:G[i][j]=min{ G[i+1][j] , G[i][j+1] ,G[i+1][j+1] } + 1; 解析: G[i+1][j] ,G[i][j+1] , G[i+1][j+1]分别为(i,j)

Batman_的博客 362

FPGA实战:用DDR3和乒乓操作解决视频帧撕裂问题(附Verilog代码)

本文详细介绍了如何利用DDR3内存和乒乓操作架构解决FPGA视频处理中的帧撕裂问题。通过多帧缓存原理、AXI接口配置和自适应乒乓操作设计,有效隔离读写操作,确保视频流稳定传输。文章包含Verilog代码实现和性能优化技巧,适用于工业相机、医疗影像等高速视频处理场景。

m2n3b4v5c6的博客 289

动态规划算法

概念及意义  动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单

zhongxiaobin的专栏 1028

让 ABAP 开发者也能做出高质量 SAP Fiori:到底需要掌握多少前端知识?

文章摘要: 随着SAP技术演进,ABAP开发者的角色边界正在重构。传统SAP GUI时代的全栈开发模式逐渐转向RAP+Fiori Elements的新范式,其中关键技术变化包括: 开发模式转变:从前后端耦合转向RAP模型驱动开发,通过CDS注解实现UI意图表达 分工优化:Fiori Elements模板处理80%标准UI需求,Flexible Programming Model解决20%差异化需求 效率提升:注解驱动开发可在RAP建模阶段同步定义UI结构,大幅缩短交付周期 工具整合:SAP提供从建模到部署的

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 348

学Simulink--机器人基础关节控制场景实例:基于Simulink的无刷直流电机(BLDC)关节六步换相位置控制仿真

本文详细介绍了基于Simulink的BLDC六步换相位置控制仿真方法,针对机器人关节的低成本控制需求。重点阐述了霍尔定位、六步换相和位置闭环三大核心原理,通过Simulink建模实现了从霍尔信号处理到位置环控制的全流程。仿真结果表明,该系统可实现0.3°的定位精度和80ms的响应时间,满足教育机器人等应用场景需求。文章还提供了核心代码模块和参数设置方法,并探讨了转矩脉动抑制、无传感器控制等进阶优化方向,为低成本机器人关节驱动提供了实用解决方案。

amy_mhd的博客 152

usaco 3.3 game1 2008.11.7

usaco 3.3 game1 2008.11.7 问题:我的理解错误,他说是一个序列,放当成了分好多不同的行,是一个矩阵,实际上是一个线形的序列 法一:贪心,过四组 { ID: PROG: game1 LANG: PASCAL } program p_game1; const fin='game1.in';fout='game1.out'; var f1,f2:text;

Batman_的博客 386

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

USACO-Section3.3 A Game【动态规划】

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

tjj1998的博客 557

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

USACO Section 3.3 A Game pascal

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

叫我小雷雷就好 1380

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【USACO3.3.5】一个游戏

程序里有解释 #include #include #include #include using namespace std; int n; int a[105], s[105]={0}; int f[105][105]; /* f[i][j] 面对[i,j]的区间, 所能取得的最大值 显然后面对的,能取得的值就是s[j]-s[i - 1] - f[i][j]

ACMer不要报考高校代码为13627的移通学院! 707

动态规划之练习题

练习题 USACO 2.2 Subset Sums 题目如下: 对于从1到N的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的。 举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的: {3}and {1,2} 这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数) 如果N

GS_MY的专栏 2023

CPP【北京大学暑期课《ACM/ICPC竞赛训练》】高山滑雪

【问题描述】     Michael喜欢滑雪这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。     Michael想知道载一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子。   一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条

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

Cpp环境【BZOJ1626】【Usaco2007 Dec】【Vijos 1693】 修建道路

【问题描述】            Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场)。有些农场之间原本就有道路相连。   所有N个农场(用1..N顺次编号)在地图上都表示为坐标为(X_i,Y_i)的点(),两个农场间道路的长度自然就是代表它们的点之间的距离。现在F

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

Cpp环境【NOIP2011普及组】【Vijos1787】 瑞士轮

【问题描述】   在双人对决的竞技性比赛,如万智牌比赛(万智大法好)中,最常见的赛制是淘汰赛和循环赛。前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高。后者的特点是较为公平,偶然性较低,但比赛过程往往十分冗长。   本题中介绍的瑞士轮赛制,因最早使用于 1895 年在瑞士举办的国际象棋比赛而得名。它可以看作是淘汰赛与循环赛的折衷,既保证了比赛的稳定性,又能使赛程不至于过长。   2*

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

Cpp环境【POJ 2375】【Vijos1642】雪场缆车

【问题描述】   约翰的表哥罗恩生活在科罗拉多州。他进来打算教他的奶牛们滑雪,但是奶牛们非常害羞,不敢在游人如织的度假胜地滑雪。没办法,他只好自己建滑雪场了。   罗恩的雪场可以划分为W列L行,每个方格都有一个特定的高度H。奶牛可以在相邻邻方格间滑雪,而且不能由低到高滑。  为了保证任意方格可以互通,罗恩打算造一些直达缆车。缆车很强大,可以连接任意两个方格,而且是双向的。而且同一个方格可以造多台缆

天地皆逆旅,你我本行人。 733
上一篇: Cpp环境【Code[VS]4175】【CQYZOJ1824】收费站
下一篇: Cpp环境【NOIP2015 D1P2】【Viijos1979】【Code[VS] 4511】【CQYZOS3198】 信息传递
cqyz_Lebmond
博客等级 码龄10年 18粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值