`

(转)一个游戏得分算法

阅读更多

 

【问题描述】 
某国度的人,喜欢玩这样一个游戏,在一块板上写着一行数,共n个。两个游戏者,轮流从最右或最左取一个数。刚开始,每个游戏者的得分均为20。如果一个游戏者取下一个数,则将该数的值加到该游戏者的得分上,最后谁的得分最高谁就赢了游戏。给出这n个数( 从左往右), 假设游戏者都是非常聪明的,问最后两个人的得分(假设第一个人首先取数)。 
【输入】 
输入格式:第一行为n(2<=n<=100),第二行为n个数,每个数字之间均用空格隔开。 
【输出】 
输出为两个游戏者的得分。第一个数表示第一个游戏者的得分,第二个数为第二个游戏者的得分,两个数字之间用空格隔开。 

程序运行后结果示例: 
【样例输入】 

4 7 2 9 5 2 
【样例输出】 
38 31

public class ScoreGame { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
Integer[] examp = new Integer[]{4,7, 2, 9, 5, 2}; 

LinkedList<Integer> queue = new LinkedList<Integer>(); 
queue.addAll(Arrays.asList(examp)); 

int scoreA = scoreFirst(queue)+20; 
int scoreB = calcSum(queue)-scoreA+20; 
System.out.println("A的得分: "+scoreA); 
System.out.println("B的得分: "+scoreB); 
} 

public static int scoreFirst(Deque<Integer> queue){ 
if(queue.size()<2) 
throw new IllegalArgumentException("数组个数不能小于2"); 
if(queue.size()==2){ 
int first = queue.pollFirst(); 
int last = queue.pollLast(); 
return first>=last?first:last; 
}else{ 
int sum = calcSum(queue); 

LinkedList<Integer> pollFirstQueue = new LinkedList<Integer>(queue); 
pollFirstQueue.pollFirst(); 
int result1 = sum - scoreFirst(pollFirstQueue); 

LinkedList<Integer> pollLastQueue = new LinkedList<Integer>(queue); 
pollLastQueue.pollLast(); 
int result2 = sum - scoreFirst(pollLastQueue); 

return result1>result2?result1:result2; 
} 
} 

public static int calcSum(Deque<Integer> queue){ 
int sum = 0; 
for(Integer i:queue){ 
sum+=i; 
} 
return sum; 
} 
} 
运行结果: 
A的得分: 38 
B的得分: 11 

 

 

没有用双端队列的做法:    
public static int scoreFirst2(int[] array, int sIndex, int eIndex) {    
if (eIndex - sIndex < 1)    
throw new IllegalArgumentException("数组个数不能小于2");    
if (eIndex - sIndex == 1) {    
int first = array[sIndex];    
int last = array[eIndex];    
return first >= last ? first : last;    
} else {    
int sum = calcSum(array, sIndex, eIndex);    
int result1 = sum - scoreFirst2(array, sIndex + 1, eIndex);    
int result2 = sum - scoreFirst2(array, sIndex, eIndex - 1);    
return result1 > result2 ? result1 : result2;    
}    
}    
  
public static int calcSum(int[] array, int s, int e) {    
int sum = 0;    
for (int i = s; i <= e; ++i) {    
sum += array[i];    
}    
return sum;    
}  

 

分享到:
评论

相关推荐

    动态规划算法—多边形游戏

    多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符”+”或”*”。所有边依次用整数从1到n编号。 游戏第1步,将一条边删除。 随后n-1步按以下...

    多边形游戏动态规划算法的Java实现

    多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。 游戏第1步,将一条边删除。 随后n-1步按以下...

    多边形游戏--算法分析

    多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。 游戏第1步,将一条边删除。 随后n-1步按以下...

    算法分析实习-多边形游戏(动态规划)

    多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。 游戏第1步,将一条边删除。 随后n-1步按以下...

    多种深度强化学习算法在雅达利游戏pong中的设计与实现

    多种深度强化学习算法在雅达利游戏pong中的设计与实现

    经典算法教程 举例详解

    经典算法.pdf 算法举例详解 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem) 数、运算 ...

    算法分析的多边形游戏

    多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。 游戏第1步,将一条边删除。 随后n-1步按以下...

    C语言经典算法大全

    C语言经典算法大全 老掉牙 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem...

    经典算法全部用C语言实现

    以下算法均用C语言实现,代码可运行 老掉牙 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题...

    二进制算法小游戏.zip

    本作品是一个将二进制转化为十进制的智力小游戏。 1.通过STM32F103ZET6产生二进制随机数,随机点亮四盏LED灯,蓝灯为最高位,即蓝灯亮时为1*2^3,红灯亮时为1*2^2,黄灯亮时为1*2^1,绿灯亮时为1*2^0。 2.通过四...

    取数对弈(算法)

    取数游戏是一个 2 人对策游戏。游戏开始时将 n 个数在棋盘上从左到右排成一行。 甲乙双方轮流在这一行数的左右两端取数,直至全部取完 n 个数。每人所取得的数的总和为其得分值。 最后双方得分多者获胜。(游戏...

    数据结构与算法

    多维矩阵转一维矩阵 上三角、下三角、对称矩阵 奇数魔方阵 4N 魔方阵 2(2N+1) 魔方阵 堆叠、伫列 堆叠 - 使用阵列实作 堆叠 - 使用链结实作(C 语言动态记忆体宣告) 堆叠 - 使用 Java 作物件封装 伫列 -...

    经典算法(C语言)包含51个经典算法的C语言实现

    1.汉若塔 2 2.费式数列 3 3. 巴斯卡三角形 4 4.三色棋 5 5.老鼠走迷官(一) 7 ...47.多维矩阵转一维矩阵 111 48.上三角、下三角、对称矩阵 113 49.奇数魔方阵 115 50.4N 魔方阵 117 51.2(2N+1) 魔方阵 119

    C语言 经典算法 算法大全

    C语言经典算法,包括1.汉若塔 2 2.费式数列 3 3. 巴斯卡三角形 4 4.三色棋 5 5.老鼠走迷官(一) 7 6.老鼠走迷官(二) 9 7.骑士走棋盘 10 8.八皇后 13 9.八枚银币 15 10.生命游戏 17 11.字串核对 20 12.双色、三色...

    c++实现多边形游戏

    描述: 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。 游戏第1步,将一条边删除。 随后n-1步按...

    多边形问题动态规划算法

    多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“x”。所有边依次用整数从1到n编号。 游戏第一步,将一条边删除。 随后的n-1步按以下...

    安卓2048小游戏,View游戏框架,可一键运行+源代码+文档说明+游戏截图

    游戏全部场景只有一个Activity和一个View。 基本的游戏逻辑、算法。 流畅的动画效果,自定义动画类实现。 得分变化与动画、逻辑的同步。 游戏结束与达到2048均有提示效果。 在游戏退出或被销毁时通过...

    使用遗传算法训练飞扬的鸟_python_代码_下载_flappy bird

    Crossover 将为两个选定的父级交换第一层(输入 -&gt; 隐藏) 随机变异确保模型在每次迭代中都发生变化 进度截图 阶段1 最初,所有模型都会做“相同”的错误事情。所以他们都会很快死去。 未经训练的不扩散 第二阶段...

    使用遗传算法训练的神经网络,用于预测俄罗斯方块中的下一个最佳移动_Processing_代码_下载

    效果展示: ... 计分 1 行清零 = 100 分 ...返回一个移动集,然后系统执行该移动集以将棋子放置到选定的位置。 有 10 列和 4 个旋转,因此每件有 40 个位置要计算。 更多详情,请下载后阅读README.md文件

Global site tag (gtag.js) - Google Analytics