给出3个参数,N,M,K,怪兽有N滴血,等着英雄来砍自己,英雄每一次打击,都会让怪兽流失[0~M]的血量,到底流失多少?每一次在[0~M]上等概率的获取一个值,求K次打击之后,英雄把怪兽砍死的概率

给出3个参数,N,M,K,怪兽有N滴血,等着英雄来砍自己,英雄每一次打击,都会让怪兽流失[0~M]的血量,到底流失多少?每一次在[0~M]上等概率的获取一个值,求K次打击之后,英雄把怪兽砍死的概率

问题描述:给出3个参数,N,M,K,怪兽有N滴血,等着英雄来砍自己,英雄每一次打击,都会让怪兽流失[0~M]的血量,到底流失多少?每一次在[0~M]上等概率的获取一个值,求K次打击之后,英雄把怪兽砍死的概率

例如:

int N =  6;
int M = 3;
int K =  5;

解决方案:采用暴力递归加动态规划的思想

1、暴力递归:核心代码如下

public class NanDaoKillMonster {public static void main(String[] args) {int N =  6;int M = 3;int K =  5;double ans1 = killMonster(N, M, K);double ans2 = killDp1(N, M, K);double ans3 = killDp2(N, M, K);System.out.println("ans1:"+ans1+";ans2:"+ans2+";ans3:"+ans3);}private static double killMonster(int N, int M, int K) {if(N < 1 || M < 1 || K < 1){//边界验证return 0;}long all = (long) Math.pow(M + 1,K);//理想情况下打击的次数long kill = killProcess(K,M,N);//kill怪兽的次数//两者相比就是kill的概率return (double)((double)kill/(double)all);}private static long killProcess(int times, int M, int hp) {if(times == 0){//还剩0次时,验证怪兽是否打死return hp <= 0? 1:0;}if(hp <= 0){//如果怪兽已经没血了,直接返回此种情况kill的次数return (long)Math.pow(M + 1,times);}int ways = 0;for(int i = 0;i <= M;i++){//每次次数减 1,血滴数减 i,进行暴力递归ways +=killProcess(times -1,M,hp - i);}return ways;}
}

2、动态规划思想:

2.1、二维数组如图:

这是血量大于0的情况图,小于0的情况大家可以脑补一下,总之,思路是一样的。 

2.2、核心代码如下:

public class NanDaoKillMonster {public static void main(String[] args) {int N =  6;int M = 3;int K =  5;double ans1 = killMonster(N, M, K);double ans2 = killDp1(N, M, K);double ans3 = killDp2(N, M, K);System.out.println("ans1:"+ans1+";ans2:"+ans2+";ans3:"+ans3);}private static double killDp1(int N, int M, int K) {if(N < 1 || M < 1 || K < 1){return 0;}long all = (long)Math.pow(M + 1,K);//理想情况下打击的次数long[][] dp = new long[K+ 1][N + 1];dp[0][0] = 1;//初始化次数for(int times = 1;times <= K;times++){//如果怪兽已经没血了,直接返回此种情况kill的次数dp[times][0] = (long)Math.pow(M + 1,times);for(int hp = 1;hp <= N;hp++){//遍历怪兽的血滴long ways = 0;/*** [0~M]比如 M = 3,* dp[5][10] 依赖dp[4][10],dp[4][9],dp[4][8],dp[4][7],* 因此有下面的循环依赖*/for(int i = 0;i <= M;i++){if(hp - i >= 0){//如果还有血滴,继续叠加ways += dp[times - 1][hp - i];}else {//如果怪兽已经没血了,直接返回此种情况kill的次数ways += (long)Math.pow(M + 1,times - 1);}}dp[times][hp] = ways;}}long kill = dp[K][N];//kill怪兽的次数//两者相比就是kill的概率return (double)((double)kill/(double) all);}}

3、升级版动态规划:

3.1、核心代码如下:

public class NanDaoKillMonster {public static void main(String[] args) {int N =  6;int M = 3;int K =  5;double ans1 = killMonster(N, M, K);double ans2 = killDp1(N, M, K);double ans3 = killDp2(N, M, K);System.out.println("ans1:"+ans1+";ans2:"+ans2+";ans3:"+ans3);}private static double killDp2(int N, int M, int K) {if(N < 1 || M < 1 || K < 1){return 0;}long all = (long)Math.pow(M + 1,K);long[][] dp = new long[K + 1][N + 1];dp[0][0] = 1;for(int times = 1;times <= K;times++){dp[times][0] = (long)Math.pow(M + 1,times);/*** 比如:* [0~M]假设 M = 7,* dp[5][10] 依赖 dp[4][10 ~ 3]八个位置的数值* dp[5][11] 依赖 dp[4][11 ~ 4]八个位置的数值 ,又等于dp[5][10] + dp[4][11] - dp[4][3]* 因此有下面的循环依赖* 总结通用公式:*      dp[i][j-1] = dp[i-1][j-1 ~ j-1-M]*      dp[i][j] = dp[i-1][j ~ j-M]*      dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1-M]*      前提是血量 j>0,如果 j < 0,此种次数(M + 1)的 i即times 次方*/for(int hp = 1;hp <= N;hp++){dp[times][hp] = dp[times - 1][hp] + dp[times][hp - 1];if(hp - 1 - M >= 0){dp[times][hp] -= dp[times -1][hp - 1 -M];}else {dp[times][hp] -= Math.pow(M + 1,times - 1);}}}long kill = dp[K][N];//两者相比就是kill的概率return (double)((double)(kill)/(double)(all));}}

4、三种方案执行结果如下:

 

到此,该算法分享完毕,大家一定要多练习勤于思考,定会进步很快!

发布者:admin,转转请注明出处:http://www.yc00.com/news/1700015700a959362.html

相关推荐

  • 【Linux篇】自主Shell命令行解释器

    1. 获取用户名的接口通过环境变量来获取我们需要用到的接口getenv代码语言:javascript代码运行次数:0运行复制获取用户名const char* GetUserName(){const char* name = gete

    2小时前
    00
  • 解密prompt系列52. 闲聊大模型还有什么值得探索的领域

    在DeepSeek-R1的开源狂欢之后,感觉不少朋友都陷入了技术舒适区,但其实当前的大模型技术只是跨进了应用阶段,可以探索的领域还有不少,所以这一章咱不聊论文了,偶尔不脚踏实地,单纯仰望天空,聊聊还有什么有趣值得探索的领域,哈哈有可能单纯是

    2小时前
    20
  • 【AI 进阶笔记】SSD 改进:DSSD

    1. 开篇:SSD 的进化之路如果你是目标检测领域的新人,可能听过 SSD(Single Shot MultiBox Detector),这是一种非常高效的目标检测算法。它比传统的 R-CNN、Faster R-CNN 更快,因为它直接从图

    1小时前
    10
  • 开源协议不能随便选!选错直接被「背刺」

    大家好,这里是程序员晚枫,全网同名。今天咱们唠唠开源协议这档子事儿。就像菜市场买菜得看农药残留,选开源协议稍不注意,你的项目可能就被「闭源背刺」或者「专利埋雷」了。咱程序员讲究个「拿来主义」,但拿之前得先搞清楚规则——不然分分钟吃官司!1.

    1小时前
    10
  • AI幻觉下,如何识别虚假信息

    其实目前来看,AI 在很多时候确实存在幻觉现象,尤其是在处理严谨性较强的问题时,例如数学题、编程问题等,经常会给出错误答案,甚至出现胡编乱造的情况。那为什么当前的大模型会出现幻觉呢?其根本原因在于,这类模型本质上是生成式 AI,基于概率语言

    1小时前
    10
  • Prompt Engineering 深度解析:如何提升大模型的理解能力?

    Prompt Engineering 深度解析:如何提升大模型的理解能力?一、Prompt Engineering 的基本概念与原理Prompt Engineering 是一种通过设计精心构造的提示(Prompt)来引导大型语言模型(LLM

    1小时前
    10
  • 搭建 LLM 对话的前端框架对比

    引言随着大语言模型(LLM)的广泛应用,越来越多的开发者希望构建交互式对话系统,以便用户能够便捷地与 AI 进行交流。一个良好的前端框架不仅可以提高用户体验,还能简化开发流程,提高系统的可扩展性。目前,市面上有多种适用于 LLM 对话的前端

    1小时前
    00
  • 解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用

    引言在Oracle数据库开发中,双引号(")的使用是一个容易被忽视但极其重要的细节。许多开发者在使用SQL时可能会遇到表名或列名与关键字冲突、需要保留大小写、或者包含特殊字符的情况。本文将全面解析Oracle双引号在SQL中的特殊

    1小时前
    00
  • stream的串并行处理是什么?

    1、串行处理:默认情况下,Stream执行的操作是串行的,即数据按照顺序逐个处理。 示例:Stream.of(1, 2, 3, 4, 5).reduce((a, b) -> a + b).ifPresent(System.out::p

    1小时前
    00
  • 图解7种分布式事务模型(一文带你掌握分布式事务)

    Hello 我是方才,10人研发leader、4年团队管理&架构经验。文末,方才送你一份25年最新的架构师备考资料,记得领取哟!分布式事务是微服务架构中的核心挑战之一,尤其在跨服务、跨数据库操作时需保证数据一致性。今天方才就通过图解

    55分钟前
    00
  • 用DeepSeek学嵌入式5:单个数码管静态显示

    具体实现功能:用DeepSeek编写C语言代码,实现单个数码管静态显示“9”。设计介绍51单片机简介51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应用系统提供高灵活、超有效的解决

    54分钟前
    00
  • 企业级AI“脱虚向实”,落地还有几道槛?

    从ChatGPT横空出世,到越来越智能化的人形机器人,再到让世人惊艳的Sora文生视频……种种迹象表明,人工智能逐渐迎来产业化的临界点。当全球科技巨头们将AI的边界推向星辰大海时,绝大多数企业仍在经历着AI落地的“高原反应”。某制造业CIO

    43分钟前
    00
  • 实测对比|法国 AI 独角兽公司发布的“最强 OCR”,实测效果如何?

    3月上旬,法国一家AI独角兽公司进军OCR(光学字符识别)领域,发布了一个号称“全世界最好的OCR”产品,根据其技术团队的说明,这款OCR产品具备优秀的准确度和认知能力,能够理解文档的每个元素(包括文本、表格、公式等),从图像和PDF中提取

    40分钟前
    00
  • Orange,可以拖拉拽的Python数据挖掘软件,强烈推荐~

    Python是数据挖掘的核心编程语言,但一般门槛较高,你得掌握pandas、numpy、sklearn、keras等复杂的数据处理和机器学习框架,才能写一些数据挖掘算法,因此让不少人望而却步。最近尝试用了Python中一个支持拖拉拽的数据挖

    34分钟前
    00
  • 混合APP的性能测试

    混合APP的性能测试是确保应用能够提供流畅、响应迅速用户体验的关键环节。由于混合APP的特性(通常基于Web技术封装在原生容器中,或使用跨平台框架),其性能测试需要考虑多个方面。以下是一些关于混合APP性能测试的重要方面。一、性能测试的关键

    28分钟前
    20
  • 单倍型的显著性分析

    大家好,我是邓飞。GWAS分析完成后,进行单倍型图分析的核心目的是验证显著性位点的可靠性并深入理解其遗传背景,具体原因包括以下几点:排除假阳性结果GWAS发现的显著性位点可能因多重检验或群体结构干扰产生假阳性。单倍型图通过分析显著性位点上

    18分钟前
    00
  • FPGA 2025最佳论文

    这篇文章再来看一篇新鲜出炉的论文,是上海交大和清华大学共同发表的一篇论文。这篇论文获得了FPGA 2025最佳论文奖,是用FPGA对视频生成大模型进行加速优化,最终得到的效果非常不错。这也符合我们的预期,FPGA目前还是可以做各种工程的加速

    3分钟前
    00

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信