当前位置: 首页 > news >正文

AcWing-游戏

1388. 游戏 - AcWing题库

所需知识:博弈论,区间dp

由于双方都采取最优的策略来取数字,所以结果为确定的,有可能会有多个不同的过程,但是我们只需要关注最终结果就行了。

方法一:

定义dp[i][j] 表示区间i到j中先手能取得的最大值,依次遍历区间,最后判断最大值,因为区间长度长的来源必定是区间长度短的,所以我们可以第一层遍历区间的长度,第二层遍历区间的左端点。

状态转移方程式:dp[i][j]=max(w[i]+s[j]-s[i]-dp[i+1][j],w[j]+s[j-1]-s[i-1]-dp[i][j-1]);

对于状态转移方程式的解释:

若选择左边的数字,则,下一个人在i+1到j中选择对于他自己而言的最优解,所以,dp[i][j] 为w[i] +s[j]-s[i] (i+1到j的区间和) -dp[i+1][j](减去下一个人能拿的最大值)。

若选择右边的数字,则,下一个人在i到j-1中选择对于他自己而言的最优解,所以,dp[i][j] 为w[j] +s[j-1]-s[i-1] (i到j-1的区间和) -dp[i][j-1](减去下一个人能拿的最大值)。

最后取最大值,即为答案。

C++代码:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;int N;
int dp[105][105];
int w[105],s[105];
int main()
{cin>>N;for (int i = 1; i <= N; i ++ ){cin>>w[i];s[i]=s[i-1]+w[i];}for(int len=1;len<=N;len++){for(int i=1;i<=N;i++){int j=i+len-1;dp[i][j]=max(w[i]+s[j]-s[i]-dp[i+1][j],w[j]+s[j-1]-s[i-1]-dp[i][j-1]);}}cout<<dp[1][N]<<' '<<s[N]-dp[1][N];return 0;
}

方法二:

定义dp[i][j] 表示在区间i到j内先手能拿到的最优值减去后手拿的最优值,即为A-B(A为方法一中的区间最大值,B为区间和减最大值);

遍历方法仍和方法一一样,先遍历一遍区间长度,然后再遍历左端点的值。

状态转移方程式:dp[i][j]=max(w[i]-dp[i+1][j],w[j]-dp[i][j-1]);

对于状态转移方程式的解释:

若取左边的数,则下一个人在区间i+1到j中取dp[i+1][j]表示该区间中的max(B-A),所以-dp[i+1][j]表示该区间中A-B的最大值,在加上w[i],表示区间i到j中A-B的最大值;

同理,若取右边的数,则下一个人在区间i到j-1中取dp[i][j-1]表示该区间中的max(B-A),所以-dp[i][j-1]表示该区间中A-B的最大值,在加上w[j],表示区间i到j中A-B的最大值;

最后dp[1][N]表示该区间内A-B的最大值,又因为A+B=sum(sum为所有元素和);

联立两个方程解得,A=(dp[1][N]+sum)/2;B=(sum-dp[1][N])/2;

C++代码:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;int N;
int dp[105][105];
int w[105],s[105];
int sum=0;
int main()
{cin>>N;for (int i = 1; i <= N; i ++ ){cin>>w[i];sum+=w[i];}for(int len=1;len<=N;len++){for(int i=1;i+len-1<=N;i++){int j=i+len-1;dp[i][j]=max(w[i]-dp[i+1][j],w[j]-dp[i][j-1]);}}cout<<(sum+dp[1][N])/2<<' '<<(sum-dp[1][N])/2;return 0;
}

相关文章:

  • 02 _ 分布式系统的指标:啥是分布式的三围
  • 计算机体系结构(1) 介绍和基础
  • iOS MT19937随机数生成,结合AES-CBC加密算法实现。
  • C语言从入门到实战————文件操作
  • 【头歌-Python】 函数自学引导
  • 探索IOT物联网接入数据中台架构的关键要素
  • Vue-B站学习笔记
  • 美国MDO4054B-3泰克混合域示波器
  • 【Redis】NoSQL之Redis的配置和优化
  • 本地MinIO存储服务通过Java程序结合cpolar实现远程连接上传文件
  • 深度优先搜索算法C实现
  • RFID智能绘本柜助力优化儿童阅读体验。
  • k8s部署efk
  • C#设计简单的WinForms多窗口应用程序[示例]
  • 对称排序(蓝桥杯)
  • 【css3】浏览器内核及其兼容性
  • cookie和session
  • express如何解决request entity too large问题
  • HashMap剖析之内部结构
  • isset在php5.6-和php7.0+的一些差异
  • Java到底能干嘛?
  • Java深入 - 深入理解Java集合
  • Material Design
  • React-Native - 收藏集 - 掘金
  • scrapy学习之路4(itemloder的使用)
  • Spark RDD学习: aggregate函数
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 大型网站性能监测、分析与优化常见问题QA
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于 Cirru Editor 存储格式
  • 使用common-codec进行md5加密
  • 数据可视化之 Sankey 桑基图的实现
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 怎样选择前端框架
  • 智能网联汽车信息安全
  • ​马来语翻译中文去哪比较好?
  • #git 撤消对文件的更改
  • (07)Hive——窗口函数详解
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (5)STL算法之复制
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Ruby)Ubuntu12.04安装Rails环境
  • (第一天)包装对象、作用域、创建对象
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)UDP基本编程步骤
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net 受管制代码
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET面试题(二)
  • .net生成的类,跨工程调用显示注释