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

福哥答案2021-02-15:
这道题直接背,用自然智慧很难想到,平时需要锻炼敏感度。
1.递归。有代码。
先手 依赖 后手递归加数组元素的最大值。
后手 依赖 先手递归的最小值。
为了方便记忆,先手选大的,后手被迫选小的。实际上,先手和后手都是尽自己的努力选大的。这表面上看起来是违背了自然智慧的。
2.动态规划。有代码。
先手dp依赖【后手左】和【后手下】。
后手dp依赖【先手左】和【先手下】。

代码用golang编写,代码如下:

package main

import "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 := 0
R := startCol
for 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代码](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class18/Code02_CardsInLine.java)
[评论](https://user.qzone.qq.com/3182319461/blog/1613344101)

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

  1. [原]Java面试题-输入一个整型数组,找出最大值、最小值,并交换。

    [Date]2013-09-19 [Author]wintys (wintys@gmail.com) http://wintys.cnblogs.com [Content]: 1.面试题 输入一个整型 ...

  2. 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)。

    如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和.不过非常遗憾的是,由于长度为n的数组有O(n2)个子数组(即:n + n-1 + ... + 1=n(n+1)/2):而且求一个长度为n的 ...

  3. 整型数组与vector对象之间的相互初始化

    #include<iostream> #include<vector> #include<string> using namespace std; int main ...

  4. 在主方法中定义一个大小为50的一维整型数组,数组i名为x,数组中存放着{1,3,5,…,99}输出这个数组中的所有元素,每输出十个换一行

    package hanqi; import java.util.Scanner; public class Test7 { public static void main(String[] args) ...

  5. [JavaScript] 将字符串数组转化为整型数组

    var dataStr="1,2,3,4,5";//原始字符串 var dataStrArr=dataStr.split(",");//分割成字符串数组 var ...

  6. Java基础:整型数组(int[]、Integer[])排序

    Windows 10家庭中文版,java version "1.8.0_152",Eclipse Oxygen.1a Release (4.7.1a), 参考链接:http://w ...

  7. 含有n个元素的整型数组,将这个n个元素重新组合,求出最小的数,如{321,3,32},最小的数为321323

    public class GetMinNumber { public static void main(String[] args) { String[] arr = null; System.out ...

  8. 按要求编写Java应用程序。 编写一个名为Test的主类,类中只有一个主方法; 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元素,每输出十个换一行;在主方法中定义一 个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

    int[]x=new int [50]; char[][]y=new char[10][10]; int j=1,w=0; for(int i=0;i<50;i++) { x[i]=j; j+= ...

  9. 编写一个名为Test的主类,类中只有一个主方法; 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元素,每输出十个换一行;在主方法中定义一 个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

    package liu0915; import java.util.Random; public class Test0915sz { public static void main(String[] ...

  10. 16.按要求编写Java应用程序。 编写一个名为Test的主类,类中只有一个主方法; 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元素,每输出十个换一行;在主方法中定义一 个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

    //分类 package com.bao; public class Shuchu { int[]yi=new int[50]; String[][]er=new String[10][10]; vo ...

随机推荐

  1. LeetCode86 分隔链表

    idea: 烦死了,这个题一直因为创立的指针为空,或者接入结点方法不对,结果将两个小链表搞混乱了,不过具体思路ok.将小值结点成一组,大值结点成一组,最后在首尾相连,实现起来也比较简单 /**  *  ...

  2. C#中Base64转换为byte[]再进行处理

    byte[] arr = Convert.FromBase64String(temp.Substring(temp.IndexOf(",") + 1)); using (Strea ...

  3. STM32 系统初始化

    #include "system.h" void system_init(void){ //系统中断设置,抢占优先级0~15,无子优先级 NVIC_PriorityGroupCon ...

  4. github相关操作

    github里面有很多大神写的代码,但是有不少小伙伴对使用它比较的生疏,下面我就把它的简单和常规的操作说一下,希望对你查看github有一定的帮助. watch :会持续收到该项目的动态 fork : ...

  5. 面向对象分析与设计(V3)第一章:复杂性

    书名(中):面向对象分析与设计 书名(英):Object-Oriented Analysis and Design with Applications 作者:Grady Booch等 第一部分.概念 ...

  6. DSC:数仓SQL脚本迁移的神奇工具

    摘要:本文介绍的DSC工具是针对数据库切换时面临的迁移任务而开发的免安装命令行工具.目的是提供简单.快速.可靠的SQL脚本迁移服务. 本文分享自华为云社区<GaussDB(DWS)DSC工具系列 ...

  7. k8s HPA(HorizontalPodAutoscaler)--自动水平伸缩

    写在前面 我们平时部署web服务,当服务压力大撑不住的时候,我们会加机器(加钱):一般没有上容器编排是手动加的,临时加的机器,临时部署的服务还要改Nginx的配置,最后回收机器的时候,也是手动回收,手 ...

  8. 谁会拒绝一个开源的 3D 博客呢?

    说到博客大家一定都不陌生,不管你是深耕职场多年的老鸟,还是在学校努力学习的小鸟,应该都有过一段"装扮"博客的经历,比如:放上喜欢的图片.添加炫酷的交互.换上 DIY 的博客主题等等 ...

  9. 疯一样的向自己发问 - 剖析lsm 索引原理

    疯一样的向自己发问 - 剖析lsm 索引原理 lsm简析 lsm 更像是一种设计索引的思想.它把数据分为两个部分,一部分放在内存里,一部分是存放在磁盘上,内存里面的数据检索方式可以利用红黑树,跳表这种 ...

  10. UI/UE设计学习路线图(超详细)

    很多小伙伴认为ui设计很简单,就是用相关的软件设计制作图片.界面等.其实不然,UI设计融合了很多学科内容.要从一个完全没有基础的人成长为一个ui设计者,该如何学习呢?主要分为基础阶段和专业课程阶段,其 ...