2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿。但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿。但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明。请返回最后获胜者的分数。
福哥答案2021-02-15:
这道题直接背,用自然智慧很难想到,平时需要锻炼敏感度。
1.递归。有代码。
先手 依赖 后手递归加数组元素的最大值。
后手 依赖 先手递归的最小值。
为了方便记忆,先手选大的,后手被迫选小的。实际上,先手和后手都是尽自己的努力选大的。这表面上看起来是违背了自然智慧的。
2.动态规划。有代码。
先手dp依赖【后手左】和【后手下】。
后手dp依赖【先手左】和【先手下】。
代码用golang编写,代码如下:
package mainimport "fmt"func main() {ret := win1([]int{5, 7, 4, 5, 8, 1})fmt.Println("1.递归:", ret)ret = win2([]int{5, 7, 4, 5, 8, 1})fmt.Println("2.动态规划:", ret)
}// 根据规则,返回获胜者的分数
func win1(arr []int) int {if len(arr) == 0 {return 0}first := f1(arr, 0, len(arr)-1)second := g1(arr, 0, len(arr)-1)return getMax(first, second)
}// arr[L..R],先手获得的最好分数返回
func f1(arr []int, L int, R int) int {if L == R {return arr[L]}p1 := arr[L] + g1(arr, L+1, R)p2 := arr[R] + g1(arr, L, R-1)return getMax(p1, p2)
}// // arr[L..R],后手获得的最好分数返回
func g1(arr []int, L int, R int) int {//if L == R {// return arr[L]//}//p1 := arr[L] + f1(arr, L+1, R)//p2 := arr[R] + f1(arr, L, R-1)//return getMin(p1, p2)if L == R {return 0}p1 := f1(arr, L+1, R) // 对手拿走了L位置的数p2 := f1(arr, L, R-1) // 对手拿走了R位置的数return getMin(p1, p2)
}func win2(arr []int) int {if len(arr) == 0 {return 0}N := len(arr)fmap := make([][]int, N)gmap := make([][]int, N)for i := 0; i < N; i++ {fmap[i] = make([]int, N)gmap[i] = make([]int, N)}for i := 0; i < N; i++ {fmap[i][i] = arr[i]}for startCol := 1; startCol < N; startCol++ {L := 0R := startColfor R < N {fmap[L][R] = getMax(arr[L]+gmap[L+1][R], arr[R]+gmap[L][R-1])gmap[L][R] = getMin(fmap[L+1][R], fmap[L][R-1])L++R++}}return getMax(fmap[0][N-1], gmap[0][N-1])
}func getMax(a int, b int) int {if a > b {return a} else {return b}
}
func getMin(a int, b int) int {if a < b {return a} else {return b}
}
执行结果如下:
左神java代码
评论
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿。但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪相关推荐
- 给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,然后B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明。求最后获胜者的分数
题目:给定一个整型数组arr,代表数值不同的纸牌排成一条线.玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明.请返回最后获 ...
- 2021-04-17:给定一个整型数组 arr,数组中的每个值都为正数,表示完成一幅画作需要的时间,再 给定 一个整数 num,表示画匠的数量,每个画匠只能画连在一起的画作。所有的画家 并行工作,请
2021-04-17:给定一个整型数组 arr,数组中的每个值都为正数,表示完成一幅画作需要的时间,再 给定 一个整数 num,表示画匠的数量,每个画匠只能画连在一起的画作.所有的画家 并行工作,请 ...
- 2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小
2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小. 我的大致思路是把这个整型数组转换成String数组,然后通过String类的compareTo方 ...
- 输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)
输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).(奇安信-wab前端) 例如,输入的数组为{ 1.-2.3.10. ...
- 奇偶数分离c语言,如何把一个整型数组中,奇数偶数进行分离 怎么使数组进行奇偶奇偶相间排序...
导航:网站首页 > 如何把一个整型数组中,奇数偶数进行分离 怎么使数组进行奇偶奇偶相间排序 如何把一个整型数组中,奇数偶数进行分离 怎么使数组进行奇偶奇偶相间排序 相关问题: 匿名网友: imp ...
- c语言学习-定义一个整型数组a[10],将数组a[10]中的10个元素按逆序重新存放
定义一个整型数组a[10],将数组a[10]中的10个元素按逆序重新存放 程序流程图: 代码: #include<stdio.h> void main() { int a[10]; int ...
- C语言编程>第六周 ① 编写一个录入函数:用来从键盘接收n个整型数并存放在一个整型数组中。 在主函数中调用该函数计算出这n个整数之和。
例题:编写一个录入函数:用来从键盘接收n个整型数并存放在一个整型数组中. 在主函数中调用该函数计算出这n个整数之和. 代码如下: /*代码分析:录入函数需要两个参数:一个参数是需要用来存储数字的数组, ...
- int java 声明_怎样用java定义一个int数组 C++ 怎么声明一个整型数组?
导航:网站首页 > 怎样用java定义一个int数组 C++ 怎么声明一个整型数组? 怎样用java定义一个int数组 C++ 怎么声明一个整型数组? 相关问题: 匿名网友: int[] anA ...
- C语言编程练习 1.按如下函数原型编写程序,用一个整型数组feedback保存调查的40个反馈意见。用函数编程计算反馈意见的平均数(Mean)、中位数(Median)和众数(Mode
题目完整描述: 按如下函数原型编写程序,用一个整型数组feedback保存调查的40个反馈意见.用函数编程计算反馈意见的平均数(Mean).中位数(Median)和众数(Mode).中位数指的是排列在 ...
最新文章
- css3制作一个漂亮的按钮
- python声明_在Python中什么是全局声明?
- cocos2d python文档_【Cocos2D-X 学习笔记】Cocos2D-x 3.0+VS开发环境搭建[使用Python]
- [python] 安装numpy+scipy+matlotlib+scikit-learn及问题解决
- java线程池笔记及相关代码
- php去掉多字节字符,PHP 面试题 - 如果没有 mb 系列函数,如何切割多字节字符串...
- JavaScript中的地图与对象
- c语言c98标准,1.3.2 C语言标准
- crontab定时任务不生效问题解决
- 人生聚散,一切随缘!
- Mac软件损坏,无法打开,允许任何来源后依旧损坏
- Vue二次封装axios为插件使用
- 碗中有米,心中有他,他解决的不只是吃饭问题......
- [转] 如何用BSP树生成游戏地图
- 使用计算机有关的活动,与计算机有关的传统文化活动策划书
- Android FrameWork学习(一)Android 7.0系统源码下载\编译
- 计算机老师给新生的第一堂课怎么讲,新老师如何讲好第一堂课?看这篇就够了!...
- Python之数据分析总结
- 2021 广工 Anyview 数据结构第 5 章
- 【论文】Believe It or Not, We Know What You Are Looking at! 阅读笔记
热门文章
- 读曾鸣的《智能商业》有感
- redis之hkeys、hvals、hgetall的使用
- 集合位置(洛谷 P1491)
- 计算机打开共享网络连接打印机共享打印机,两台电脑如何共享打印机 多台电脑共享一台打印机设置方法【详细教程】...
- python写入csv文件中添加行_在python中为csv文件输出键添加值
- 【错误汇总】PYTHON开发
- STM32 CubeMX学习:7. ADC模数转化
- MATLAB命令大全和矩阵操作大全
- Android基础教程(十)build.gradle文件
- win7修改本计算机端口,如何更改Windows7 的远程桌面端口3389