当前位置: 首页 > article >正文

最大拿牌的得分

假设有个游戏,一列牌有不同分数,但是只能从两头拿 ,拿到最后分数最高的人获胜,假设两个人都是聪明人,求最后的最高分是多少?

思路:递归算法,一个人拿左边牌,另一个人的得分 和拿右边牌 另一个人的得分作比较,只拿让对方得分最小的牌,反过来也是一样,那如果轮到对方拿牌自己也将会拿到最小的分,

两个方法,分别代表A 的最大得分 B的最大得分

private  static int getAMaxPoker(int []arr, int first, int end, boolean aFirst,int total){
        if(first==end){
            if(aFirst) {
                return arr[first];
            }else{
                return 0;
            }
        }
        if(aFirst) {
            int left = arr[first];
            int otherleft = getAMaxPoker(arr, first + 1, end, false,total-left);
            int right = arr[end];
            int otherright = getAMaxPoker(arr, first, end - 1,false,total-right);
            int lefttotal=left+otherleft;
            int righttotal=right+otherright;
            if(lefttotal>righttotal){
                return lefttotal;
            }else{
                return righttotal;
            }
        }else{
           return total- getBMaxPoker(arr,first,end,true,total);
        }
    }
private  static int getBMaxPoker(int []arr, int first, int end, boolean bFirst,int total) {
        if (first == end) {
            if (bFirst) {
                return arr[first];
            } else {
                return 0;
            }
        }
        if (bFirst) {
            int left = arr[first];
            int otherleft = getBMaxPoker(arr, first + 1, end, false,total-left);
            int right = arr[end];
            int otherright = getBMaxPoker(arr, first, end - 1, false,total-right);
            if (left + otherleft > right + otherright) {
                return left + otherleft;
            } else {
                return right + otherright;
            }
        }else{
            return total-getAMaxPoker(arr,first,end,true,total);
        }
    }

测试方法:

public static void main(String[] args) {
        int []arr={1,100,2};
        int sum=0;
        for (int i = 0; i < arr.length; i++) {
            sum+=arr[i];
        }
        int maxPoker = getAMaxPoker(arr, 0, arr.length - 1, true,sum);
        System.out.println((sum-maxPoker)>maxPoker?(sum-maxPoker):maxPoker);

    }


http://www.kler.cn/a/500742.html

相关文章:

  • uniapp中rpx和upx的区别
  • HTMLHTML5革命:构建现代网页的终极指南 - 0. 课程目录设计
  • Python基于YOLOv8和OpenCV实现车道线和车辆检测
  • IT运维如何实现工作流自动化?实用案例分享
  • SQL HAVING 子句深入解析
  • python functools.partialmethod 函数介绍
  • UML建模
  • 51单片机 AT24C02(I2C总线)
  • 极狐GitLab 正式发布安全版本17.7.1、17.6.3、17.5.5
  • 在Linux上如何让ollama在GPU上运行模型
  • java项目之企业客户管理系统(ssm+mysql+vue+文档)
  • 8.Bridge 桥接模式(结构型模式)
  • [SMARTFORMS] 导出SMARTFORMS表单数据
  • Boost.Asio 同步读写及客户端 - 服务器实现详解
  • 前端学习-事件流,事件捕获,事件冒泡以及阻止冒泡以及相应案例(二十八)
  • YOLOv10-1.1部分代码阅读笔记-downloads.py
  • Docker基础篇(一)
  • 如何在C#中使用COM接口
  • Linux web资产收集
  • 计算机视觉算法实战——打电话行为检测
  • Windows下Dll在Unity中使用的一般方式
  • 运维高级课作业一
  • MeCo——给预训练数据增加源信息,就能减少33%的训练量并且提升效果