问题描述:
一个纸牌明牌显示,牌上的数值就是分数:(就是一个数组,每个数均为非负整数),设置一个数为M,每个人都是绝顶聪明,都是按最优策略顺序拿牌,
一次可拿的牌数是大于等于1,小于等于M,问先手拿牌的人最多可以得几分。
答:这题使用贪心法绝对是不行的。
比如 1,1,1,100,设置M=2
那么第一个人绝对不能第一次拿两张牌,否则第二个人就可以拿到100.
这涉及到两个人博弈问题,但是博弈策略是一样的,所以可以使用同一个函数表示博弈策略
代码如下:
package DynamicAndRecursive;public class FirstMax {/*** * @param arr 纸牌数组* @param index 纸牌的有效首地址,也就是第一个人只能从index下标开始取* @param m 一次最多几张牌* @return 第一个人最多得分*/public static int firstMax(int[] arr, int index,int m){if(arr == null || arr.length == 0 || (index < 0) || index >= arr.length ){return 0;}int len = arr.length - index;//计算出数组剩余长度是否大于mint value = 0;if(len <= m){//如果数组长度小于m,那就全部拿过来,都是正数
本文发布于:2024-02-04 02:46:02,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170698627052073.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |