题目

给定一个整型数组arr,代表数值不同的纸牌排成一条线
玩家A和玩家B依次拿走每张纸牌
规定玩家A先拿,玩家B后拿
但是每个玩家每次只能拿走最左或最右的纸牌
玩家A和玩家B都绝顶聪明
请返回最后获胜者的分数。

一、暴力递归

先手,选最好的情况,选完后变后手
后手,因为先手选了最好情况,因此后手没有选择,只剩下最差情况可选

 public static int win1(int[] arr) {if (arr == null || arr.length == 0) {return 0;}int first = f1(arr, 0, arr.length - 1);int second = g1(arr, 0, arr.length - 1);return Math.max(first, second);}// arr[L..R],先手获得的最好分数返回public static int f1(int[] arr, int L, int R) {if (L == R) {return arr[L];}int p1 = arr[L] + g1(arr, L + 1, R);int p2 = arr[R] + g1(arr, L, R - 1);return Math.max(p1, p2);}// // arr[L..R],后手获得的最好分数返回public static int g1(int[] arr, int L, int R) {if (L == R) {return 0;}int p1 = f1(arr, L + 1, R); // 对手拿走了L位置的数int p2 = f1(arr, L, R - 1); // 对手拿走了R位置的数return Math.min(p1, p2);}

二、记忆化搜索

我们发现递归过程中会有重复调用,因此我们需要记录递归过程

 public static int win2(int[] arr) {if (arr == null || arr.length == 0) {return 0;}int N = arr.length;int[][] fmap = new int[N][N];int[][] gmap = new int[N][N];for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {fmap[i][j] = -1;gmap[i][j] = -1;}}int first = f2(arr, 0, arr.length - 1, fmap, gmap);int second = g2(arr, 0, arr.length - 1, fmap, gmap);return Math.max(first, second);}public static int f2(int[] arr, int L, int R, int[][] fmap, int[][] gmap) {if (fmap[L][R] != -1) {return fmap[L][R];}int ans = 0;if (L == R) {ans = arr[L];} else {int p1 = arr[L] + g2(arr, L + 1, R, fmap, gmap);int p2 = arr[R] + g2(arr, L, R - 1, fmap, gmap);ans = Math.max(p1, p2);}fmap[L][R] = ans;return ans;}// // arr[L..R],后手获得的最好分数返回public static int g2(int[] arr, int L, int R, int[][] fmap, int[][] gmap) {if (gmap[L][R] != -1) {return gmap[L][R];}int ans = 0;if (L != R) {int p1 = f2(arr, L + 1, R, fmap, gmap); // 对手拿走了L位置的数int p2 = f2(arr, L, R - 1, fmap, gmap); // 对手拿走了R位置的数ans = Math.min(p1, p2);}gmap[L][R] = ans;return ans;}

三.动态规划

我们发现两个递归有依赖关系,因此建出两个表,f表代表先手,g表代表后手
根据f递归basie Key

if (L == R) {return arr[L];
}

当L等于R时,f[L][R]=arr[L];
根据g递归basie Key:

if (L == R) {return 0;
}

当L等于R时,g[L][R]=0;
在f递归过程中

int p1 = arr[L] + g1(arr, L + 1, R);
int p2 = arr[R] + g1(arr, L, R - 1);
return Math.max(p1, p2);

因此f[L][R]=Math.max(arr[L] + g[L + 1][R],arr[R] + g[L] [R - 1];

在g递归过程中

int p1 = f1(arr, L + 1, R);
int p2 = f1(arr, L, R - 1);
return Math.min(p1, p2);

因此g[L][R]=Math.min(f[L + 1][R],f[L] [R - 1];
得到了依赖关系,我们从每一列的对角线开始填,先填f表,再填g表,最后返回f[0][N-1],g[0][N-1]中的最大值

完整代码

 public static int win3(int[] arr) {if (arr == null || arr.length == 0) {return 0;}int N = arr.length;int[][] fmap = new int[N][N];int[][] gmap = new int[N][N];for (int i = 0; i < N; i++) {fmap[i][i] = arr[i];}for (int startCol = 1; startCol < N; startCol++) {int L = 0;int R = startCol;while (R < N) {fmap[L][R] = Math.max(arr[L] + gmap[L + 1][R], arr[R] + gmap[L][R - 1]);gmap[L][R] = Math.min(fmap[L + 1][R], fmap[L][R - 1]);L++;R++;}}return Math.max(fmap[0][N - 1], gmap[0][N - 1]);}

2.读入数据

代码如下(示例):

data = pd.read_csv('https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

零和博弈(抽牌游戏)相关推荐

  1. Java黑皮书课后题第3章:**3.24(游戏:抽牌)编写程序,模拟从一副52张的牌中抽一张牌,程序应显示牌的大小、花色

    **3.24(游戏:抽牌)编写程序,模拟从一副52张的牌中抽一张牌,程序应显示牌的大小.花色 题目 题目概述 运行示例 破题 代码 题目 题目概述 **3.24(游戏:抽牌)编写程序,模拟从一副52张 ...

  2. 用python实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)

    1.namedtuple:命名元组,可以创建一个没有方法只有属性的类 from collections import namedtuple card = namedtuple('card',['ran ...

  3. 【概率DP】$P2059$ 卡牌游戏

    [概率DP]P2059 卡牌游戏 链接 题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张 ...

  4. java卡牌游戏详解

    代码如下: package zxc;//文件夹名称 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.even ...

  5. 基于QT开发的开源局域网联机UNO卡牌游戏报告(附github仓库地址)

    源代码: https://github.com/yunwei37/UNO-game-oop 目录 1. 需求分析 1.1. UNO卡牌游戏的基本功能 1.2. UNO卡牌游戏的规则 2. 总体设计 3 ...

  6. 卡牌游戏源代码(原创)(控制台)

    游戏预览: 完成度90%,约3000行,过年这几天全用在这上面了 由于尚未学到QT等,因此只能在黑窗口下面制作了 未完成的部分: ①战斗代码未优化(800行,精简后应该能降到200行左右) ②关卡掉落 ...

  7. H - 卡牌游戏(简单期望)

    Description 小贝喜欢玩卡牌游戏.某个游戏体系中共有N种卡牌,其中M种是稀有的.小贝每次和电脑对决获胜之后都会有一个抽卡机会,这时系统会随机从N种卡中选择一张给小贝.普通卡可能多次出现,而稀 ...

  8. 牛客国庆集训派对Day2 H 卡牌游戏 [ 期望dp ]

    题目描述 小贝喜欢玩卡牌游戏.某个游戏体系中共有N种卡牌,其中M种是稀有的.小贝每次和电脑对决获胜之后都会有一个抽卡机会,这时系统会随机从N种卡中选择一张给小贝.普通卡可能多次出现,而稀有卡牌不会被重 ...

  9. 牛客--卡牌游戏 (概率DP 逆推) P2059

    题目链接:卡牌游戏 n个人,m张卡牌上有m个数字.庄家随机一张卡牌,数字为X,第X位出局,随后第X位的下一位做庄家,问,每个人最后获胜的概率是多少? 约瑟夫环的变形问题,这里每次等概率的抽牌,数字相对 ...

最新文章

  1. 【物联网智能网关-14】Html5:Canvas+WebSocket实现远程实时通信(下)
  2. 风之语.我看苏州511房产新政
  3. 干货丨揭秘深度学习的核心:掌握训练数据的方法
  4. Gradle学习目录
  5. python函数编程实战_别找了,这是 Pandas 最详细教程了
  6. 【Java数据结构】链式存储的二叉树
  7. MapReduce计算模型(二)
  8. 如何对xgboost模型进行优化
  9. 反编译OD工具OllyDBG 2.0.1下载
  10. vue 动态设置浏览器标题
  11. ajax请求接口连不上会报错吗_本地ajax请求服务器
  12. [深入研究4G/5G/6G专题-22]: 5G NR开机流程3.4 - MAC层对SIB1的调度 - SIB1消息的格式与内容
  13. teablue数据分析_大数据丨2016-2017年美国茶叶消费市场分析与展望
  14. Code Geass CD入手
  15. 常用的几种设计模式详解
  16. 24bpp RGB对应的十六进制值和颜色(节选)
  17. kafka启动异常InconsistentClusterIdException
  18. 执行力七准则---工作中如何破解困难提高执行力
  19. 服务器连接不上可能是哪些原因
  20. 随着年龄的增长,为之动容的句子,就越来越多

热门文章

  1. 首次全面定义,《2022企业应用运维管理指标体系白皮书》发布
  2. 复制ABB机器人系统
  3. xp计算机硬盘序列号,发表一个最简单的XP以上系统中获取CPUID、硬盘序列号、BIOS序列号等等的函数!(100分)...
  4. 干货 | 想给你的学术研究拍张美照吗?
  5. Motirx 一款全能的下载工具
  6. [DL]CCF大数据与计算智能大赛-小样本数据分类任务
  7. Web服务常用的几种开发方法
  8. CEO、CTO、CFO、COO公司架构
  9. 2022华为杯研究生数学建模竞赛DS数模选题建议
  10. PROE5.0立体声耳机结构设计视频教程