纸牌博弈先手最优问题

本文探讨了一个纸牌博弈问题,其中牌面数值对应得分,参与者需选择每次拿取1到M张牌。由于双方都是最优策略,先手玩家的最大得分并不总能通过贪心策略获得。例如,在序列1, 1, 1, 100且M=2的情况下,先手不应一次性拿走两张牌,以免对手拿到高分。问题的解决方法涉及博弈论,尽管是双人博弈,但策略相同,可以通过特定函数表示。" 109526635,7885975,Nginx配置错误:代理Grafana的问题与解决,"['运维', '容器', 'Grafana', 'Nginx']
摘要由CSDN通过智能技术生成

问题描述:

一个纸牌明牌显示,牌上的数值就是分数:(就是一个数组,每个数均为非负整数),设置一个数为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;//计算出数组剩余长度是否大于m
        int value = 0;

        if(len <= m){//如果数组长度小于m,那就全部拿过来,都是正数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值