【Hello Algorithm】暴力递归到动态规划(五)

死亡概率问题

现在给定你三个参数 N M K

怪兽有 N 滴血 等着英雄来砍自己

英雄每一次打击会让怪兽流失 0 ~ M 滴血 概率相同

请求在K次之后 英雄把怪兽砍死的概率

递归版本

面对这个问题 我们首先来想递归函数怎么写

首先是返回值 我们无法直接返回一个概率给上层 所以我们这里决定返回怪兽死去的次数 只要上层用所有的可能性相除就能得到概率了

接下来就是将相关的参数填到函数中 因为怪兽剩余的血量是变化的 所以说我们不使用N作为参数 而是使用rest – 怪兽的剩余血量作为参数

int process(int rest , int K , int M)

我们首先来想base case

如果剩余血量为0 如果砍的刀数等于0此时都会结束

  if (rest <= 0)                                                                                                           {                                                                                                                        return pow(static_cast<double>(M + 1) , K);                                                                            }                                                                                                                        if (K == 0)    {                                                                                                                                         return rest <= 0 ? 1 : 0;    }    

否则我们就要开始考虑其他可能性了

因为每一刀可能会砍0~M滴血 所以说一共会有M+1种可能 我们全部加起来就能得到最终结果

  int ways = 0;for (int i = 0; i <= M; i++){ways += process(rest - i , K - 1 , M);}return ways;

动态规划

接下来我们开始改写动态规划

首先我们观察到 可变参数有两个 血量和砍的次数

血量的变化范围是0~N+1 (其实可能会小于0 但是小于0我们能计算出来)

砍的次数的变化范围是0~K+1

我们将血量命名为hp 砍的次数命名为K+1

代码表示如下

int dp_process( int N , int K , int M)  
{  vector<vector<int>> dp(K + 1 , vector<int>(N + 1 , 0));  for (int i = 0; i <= K; i++)  {  dp[i][0] = pow(static_cast<double>(M+1) ,static_cast<double>(K));  }  for (int times = 1; times <= K; times++)  {  for(int hp = 1; hp <= N; hp++)  {  int ways = 0;  for (int i = 0; i<= M; i++)  {                    if (hp - i >= 0)  {  ways += dp[times - 1][hp - i];  }  else  {  ways += dp[times-1][0];  }  }  dp[times][hp] = ways;  }  }  return dp[K][M];  }

钱包问题四

arr是面值数组 其中的值都是正数且没有重复 给定一个正整数aim 返回组成aim的最小货币张数

我们首先来想base case

如果剩余的钱数小于0 那么我们无法找到最小张数

如果数组下标超过了arr 此时我们就需要分情况讨论

  • 如果此时rest为0 则0张就可以解决
  • 如果此时resr不为0 则无解

接下来我们就可以开始列可能性

我们可以选择0 ~ N张arr[index]的货币 之后将剩余的钱和下标交给下面的位置就可以

const int MAX_VAL = INT32_MAX;    int process(vector<int>& arr , int index , int rest)    
{    if (rest < 0)    {    return MAX_VAL;    }    if (index == static_cast<int>(arr.size()))    {    return rest == 0 ? 0 : MAX_VAL;    }    int ways = MAX_VAL;    for (int fix = 0; fix * arr[index] <= rest; fix++)    {    int Next =  process(arr , index + 1 , rest - fix*arr[index]);    if(Next != MAX_VAL)    {    ways = min(ways , Next + fix);                                                                                                        }    }    return ways;    
} 

动态规划

我们可以看到两个变化的量是index 和 rest

index的变化范围是 0 ~ arr的大小

rest的范围是 0 ~ aim

于是我们可以围绕着代码建立一个二维表

之后按照上面的递归代码改写即可 代码表示如下

int dp_process(vector<int>& arr ,  int aim)
{int N = static_cast<int>(arr.size()) ; // N = arr.size() vector<vector<int>> dp(N + 1 , vector<int>(aim + 1 , MAX_VAL));// base case // 1. rest < 0 ?  -1 // dp[N][0] = 0;for (int index = N -1 ; index >= 0 ; index--)                                                                                             {for(int rest = 0; rest <= aim; rest++){int ways = MAX_VAL;for (int fix = 0; fix * arr[index] <= rest; fix++){int Next =  dp[index + 1][rest - fix*arr[index]];if(Next != MAX_VAL){ways = min(ways , Next + fix);}}dp[index][rest] = ways;}}return dp[0][aim];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gRPC之gRPC转换HTTP

1、gRPC转换HTTP 我们通常把RPC用作内部通信&#xff0c;而使用Restful Api进行外部通信。为了避免写两套应用&#xff0c;我们使用grpc- gateway 把gRPC转成HTTP。服务接收到HTTP请求后&#xff0c;grpc-gateway把它转成gRPC进行处理&#xff0c;然后以JSON 形式返回数据。…

Go 语言的垃圾回收机制:自动化内存管理

在编程的世界中&#xff0c;内存管理一直是一个重要的问题。不正确的内存管理可能导致内存泄漏和程序崩溃。Go 语言以其高效的垃圾回收机制而闻名&#xff0c;使开发者从手动内存管理的烦恼中解脱出来。本文将深入探讨Go语言的垃圾回收机制&#xff0c;介绍它的工作原理以及如何…

消息队列 RocketMQ 消息重复消费问题(原因及解决)

目录 1.出现重复消费的原因 2.解决 2.1 数据库插入法 2.2 使用布隆过滤器 2.2.1 添加hutool的依赖 2.2.2 测试生产者 2.2.2 测试消费者 1.出现重复消费的原因 BROADCASTING(广播) 模式下&#xff0c;所有注册的消费者都会消费&#xff0c;而这些消费者通常是集群部署的…

ubuntu20.04下安装nc

前言 nc在网络渗透测试中非常好用&#xff0c;这里的主要记一下Ubuntu20.04中nc的安装 编译安装 第一种方式是自己编译安装&#xff0c;先下载安装包 nc.zip wget http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download -O netcat-0.7.…

当你学会这项python数据提取神器时,请做好升职准备!

一、什么是 jsonpath ● JsonPath 是一种信息抽取类库&#xff0c;是从 JSON 文档中抽取指定信息的工具&#xff0c;提供多种语言实现版本&#xff0c;包括&#xff1a;JavaScript、Python、PHP 和 Java。 二、特点 ● 只能提取 JSON 格式的数据 ● 提取后的数据类型与原数据…

2023秋招笔试算法Python3题解

诸神缄默不语-个人CSDN博文目录 签两方了&#xff0c;感觉秋招已经结束了&#xff0c;所以发布一下之前写的笔试编程题题解。 不全。可能有些题我会继续补。 不保证能过。 后续依然有可能继续刷算法题&#xff0c;但是就另外专门写博文来解析了。 打码是因为原则上其实是不让公…

国密https访问

前言 现在的SSL的加密算法实际上主要是国际算法&#xff0c;包括JDK&#xff0c;Go等语言也仅支持国际算法加密&#xff08;毕竟是国外开源项目&#xff09;&#xff0c;hash。随着国密算法的普及&#xff0c;比如openssl就支持国密了&#xff0c;还要新版本的Linux内核也开始…

【Python第三方包】实现自动化(pyautogui包)

文章目录 前言一、如何安装pyautogui二、pyautogui鼠标操作2.1 鼠标移动2.2 鼠标点击2.3 拖动鼠标三、键盘操作3.1 按下和释放按键3.2 键盘输入四、截图和图像识别4.1 截图4.2 图像识别总结前言 自动化是现代计算机编程和软件开发中的一个重要概念。通过自动化,我们可以节省时…

解决因d3dx9_30.dll丢失程序无法运行,电脑缺失d3dx9_30.dll报错解决方案

我们的生活和工作都离不开电脑。然而&#xff0c;电脑作为一种复杂的工具&#xff0c;也会出现各种各样的问题。其中&#xff0c;丢失d3dx9_30.dll文件是一个常见的问题。d3dx9_30.dll是DirectX的动态链接库文件&#xff0c;如果丢失或损坏&#xff0c;可能会导致许多软件和游戏…

[论文笔记]GPT-1

引言 今天带来论文Improving Language Understanding by Generative Pre-Training的笔记,它的中文题目为:通过生成式预训练改进语言理解。其实就是GPT的论文。 自然语言理解可以应用于大量NLP任务上,比如文本蕴含、问答、语义相似和文档分类。虽然无标签文本语料是丰富的,…

Js使用ffmpeg在视频中添加png或gif

Js使用ffmpeg在视频中添加png或gif ffmpeg 使用场景是需要在web端对视频进行编辑 添加图片和gif。 注意: 以下所有的使用案例均基于vue3 setup。 同时由于ffmpeg版本不同会导致使用的api不同&#xff0c;使用案例前需要注意ffmpeg版本问题。 如果使用的是0.12需要使用新的…

通讯录和内存动态管理

目录 (通讯录)动态增长版 实现效果 找单身狗 题目 源码 思路 三个内存函数的模拟实现 模拟实现strncpy 模拟实现strncat 模拟实现atoi (通讯录)动态增长版 该版本通讯录在原版的基础上增加了检查容量函数&#xff0c;实现了通讯录的动态…

Linux中的shell编程

shell编程 重定向 cat >temp 输入内容到temp文件中&#xff0c;如果存在temp则覆盖&#xff0c;没有则新建 cat >>temp 追加内容 cat temp1>>temp2 将temp1中的内容追加到temp 命令执行控制符号 ; 一个命令行执行多条语句 命令替换符 1.双引号&#…

插槽的基本使用和作用域插槽

1.编译作用域 父级模板里的所有内容都是在父级作用域中编译的&#xff1b;子模板里的所有内容都是在子作用域中编译的。 即父子组件只能使用各自作用域的数据 2.插槽的后备内容&#xff08;slot中默认配置内容&#xff09; 可以在slot中提前设置一段内容作为默认值&#xf…

数据结构--线性表回顾

目录 线性表 1.定义 2.线性表的基本操作 3.顺序表的定义 3.1顺序表的实现--静态分配 3.2顺序表的实现--动态分配 4顺序表的插入、删除 4.1插入操作的时间复杂度 4.2顺序表的删除操作-时间复杂度 5 顺序表的查找 5.1按位查找 5.2 动态分配的方式 5.3按位查找的时间…

Spark简介

文章目录 一、简介二、安装1、简介2、本地部署(Local模式)2.1 安装2.2 官方WordCount实例 3、Standlong模式3.1 简介2.2 安装集群2.3 官方测试案例 4、Yarn模式3.1 安装3.2 配置历史服务器3.3 配置查看历史日志 5、Mesos模式6、几种模式对比7、常用端口 三、Yarn模式详解1、简介…

3. 无重复字符的最长子串 --力扣 --JAVA

题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 解题思路 遍历字符串&#xff0c;遇到重复字符计算进行下一个子串的统计&#xff1b;从发生重复的字符第一次出现的位置进行继续循环&#xff1b;输出最长子串的长度。 代码展示 class S…

sql语句数据库查询:如果当前元素已经使用过,下拉框不显示该元素该如何查询?

写宿舍管理系统&#xff0c;做到宿管和楼栋关系时&#xff0c;新增一个宿管&#xff0c;一个宿管管理一栋楼&#xff0c;如果当前楼栋已选择&#xff0c;那么就不能再选&#xff0c;如图所示&#xff1a; 最开始使用的是&#xff1a; SELECT DISTINCT b.building_num,b.TYPE,b…

项目二开笔记-萤火商城https://www.yiovo.com/doc

很久没写过php代码了&#xff0c;二开过程中笔记如下 注意事项 打开APP_DEBUG 关于建表 .在store进行开发&#xff0c;新建表的时候需要加上store_id字段 增加页面 前端页面 增加新的菜单&#xff0c;需要在router.config.js中增加对应的配置增加新的页面&#xff0c;需要…

【Python】图像和办公文档的处理

图像和办公文档处理 用程序来处理图像和办公文档经常出现在实际开发中&#xff0c;Python的标准库中虽然没有直接支持这些操作的模块&#xff0c;但我们可以通过Python生态圈中的第三方模块来完成这些操作。 操作图像 计算机图像相关知识 颜色。如果你有使用颜料画画的经历&…