专题十三_记忆化搜索_算法专题详细总结
目录
1. 斐波那契数(easy)
那么这里就画出它的决策树 :
解法一:递归暴搜
解法二:记忆化搜索
解法三:动态规划
1.暴力解法(暴搜)
2.对优化解法的优化:把已经计算过的值存起来。
那么问题来了:
2. 不同路径(medium)
解析:
解法一:暴力
解法二:记忆化搜索
添加备忘录:
解法三:随手改动态规划
3. 最⻓递增⼦序列(medium)
解析:
解法一:暴搜
决策树暴搜:dfs
记忆化暴搜:
解法二:记忆化搜索
解法三:动态规划
4. 猜数字⼤⼩II(medium)
解析:
解法一:暴搜dfs
解法二:记忆化搜索
其实大差不差,就是专门添加一个备忘录:
5. 矩阵中的最⻓递增路径(hard)
解法一:暴搜
解法二:记忆化搜索
总结一下吧~学到现在,递归章节也算是告一段落了,我个人的进步确实有了质的变化,我自己能感受到,对于这一专题,可以很明显的看出,在遇到重复子问题,并且求关于路径个数,最长长度,多少次数之类的问题,都是要对整个决策树进行完整的遍历和取最值,但是在遍历过程种都会遇到很多重复遍历的问题,对于这种重复遍历的问题的次数,我们只需要往动态规划方面考虑的思路,这里不同于前几个章节的直接深度优先遍历,利用visit数组来判断还需不需要进入下一层,那个属于floodfill算法,要求分块的面积或者分块的个数,所以还是要好好进行区分总结!!!
为了能引入记忆化搜索的概念和体现它的完美性,这里引入一个例题来进行描述:
1. 斐波那契数(easy)
斐波那契数列的引入,相比前面那些暴搜的题目还是要简单很多,但是也不能小看这一题的简单程度,一般难的题目总是有很多简单的小块来进行综合的,所以有这题引入可以分别解决关于
暴搜 -> 记忆化搜索 -> 动态规划 的过度,
那么这里就画出它的决策树 :
这里通过这个决策树来求解斐波那契数列的暴力解就是不断的递归到最后一层,和就进行求解d[0] 和 d[1] 的值的大小:
解法一:递归暴搜
class Solution {
public:int fib(int n) {return dfs(n);}int dfs(int n){if(n==0||n==1) return n;return dfs(n-1)+dfs(n-2);}
};
虽然这里的暴搜过程十分简单,但是当我们看到这里的时间复杂度上,以及这个决策树上有着非常多的重复步骤,列入这个决策树上进行展开想求d[5]就得知道d[4]+d[3],依次类推,那么想知道d[4] 就又要知道d[3]+d[2] 那么这里就会有很多重复性的步骤,会让时间复杂度大大增加
那么在此基础上,我们只需要添加一个备忘录,让每次进行第一次递归的值能够存入到备忘录,那么只要后面再次遍历到该数的时候就能够直接得到该数,此时加入遍历的深度是O(N),那么就要递归n层在进行返回才能再次得到该值,但是如果采用记忆化搜索得到该值只需要在O(1)的时间内进行查找该值即可。
解法二:记忆化搜索
什么是带备忘录的递归?只需要在O(1)时间内就能够再次得到该值;
如何实现记忆化:
1.添加一个备忘录 实现<可变参数,返回值>(就是 下标 跟 返回值 的映射)
2.递归每次返回的时候,将结果放到备忘录里面
3.在每次进入递归的时候,往备忘录里面瞅一瞅
那么实现备忘录就需要一个一维数组进行下标与返回值的映射即可:
memo[100];
这里要对memo数组进行初始化,初始化要对该数组实现在后面递归返回值存入时不会出现的数,保证不会出现并没有存入该值却被取出值的情况:
memset(memo,-1,sizeof(memo));
class Solution {
public:int memo[31];int fib(int n) {//添加备忘录memset(memo,-1,sizeof(memo));return dfs(n);}int dfs(int n){if(memo[n]!=-1) return memo[n];if(n==0||n==1) return n;memo[n]=dfs(n-1)+dfs(n-2);return memo[n];}
};
1.这里就要对全局变量添加一个备忘录,让后进行初始化为-1;
2.在入口处就要判断当前下标为n处是否在备忘录中出现过,若出现过就直接取走;否则就进行递归在后面第一次出现的时候进行添加;
3.因为只有在最后一层的时候有明确的返回值,这样遍历到最后一层可以直接进行返回;但是memo[n]在递归过程中第一次出现的结果全部都添加到备忘录内,这样就不会出现第二次递归到最后一层的结果,然后进行第一次添加后进行最后的返回该层的memo[n];
解法三:动态规划
从动态规划内的步骤可以看出动态规划与记忆化搜索都是一一对应的,也可以说记忆化搜索其实也就是另一种形式的普通动态规划。
动态规划 和 记忆化搜索的本质:
1.暴力解法(暴搜)
2.对优化解法的优化:把已经计算过的值存起来。
在《算法导论》里面:记忆化搜索 vs 常规动态规划 -> 统称为动态规划
递归 地推(循环)
class Solution {
public:int dp[31];int fib(int n) {dp[0]=0,dp[1]=1;for(int i=2;i<=n;i++)dp[i]=dp[i-1]+dp[i-2];return dp[n];}
};
动态规划只要准备好状态转移方程就能够进行解答问题。
那么问题来了:
1.所有的递归(暴搜、深搜),都能改成记忆化搜索嘛?
不是的,只有在递归的过程中,出现了大量完全相同的问题时,才能用记忆化搜索的方式优化。
2.带备忘录的递归 vs 带备忘录的动态规划 vs 记忆化搜索
都是一回事
3.自顶向下 vs 自顶向上
所以对于记忆化搜索的问题,也就是说,在画出决策树或者递归展开图的时候,发现很多重复性的子递归,那么此时就用一个备忘录进行记录当前值,然后进行记录当前值,以便后续直接进行查找不用再次进行递归。
2. 不同路径(medium)
解析:
随便找一个点,想要求出到达当前位置的所有路径个数,那么就是:
dfs(i,j)=dfs(i-1,j)+dfs(i,j-1);
那么原点这个位置就不能从(0,0)开始,要从(1,1) 开始。所以要为这个矩阵加一行一列。
那么当i==0 或者 j==0 的时候就都是不能成立的时候,因为在这上面都是不能满足条件的。
解法一:暴力
class Solution {
public:int uniquePaths(int m, int n) {return dfs(m,n);}int dfs(int i,int j){if(i==0||j==0) return 0;if(i==1&&j==1) return 1;return dfs(i-1,j)+dfs(i,j-1);}
};
就只是利用暴搜的方式,但这个会超时,所以要对它进行记忆化改进。
解法二:记忆化搜索
class Solution {
public:int memo[101][101];int uniquePaths(int m, int n) {memset(memo,-1,sizeof(memo));return dfs(m,n);}int dfs(int i,int j){if(memo[i][j]!=-1) return memo[i][j];if(i==0||j==0) return 0;if(i==1&&j==1) return 1;memo[i][j]=dfs(i-1,j)+dfs(i,j-1);return memo[i][j];}
};
添加备忘录:
1.就是在进入dfs的时候观察有没有满足已经存在备忘录的条件的值。
2.在当前值被返回之前存入备忘录;
解法三:随手改动态规划
class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m+1,vector<int>(n+1));dp[1][1]=1;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(i==1&&j==1) continue;dp[i][j]=dp[i-1][j]+dp[i][j-1];}}return dp[m][n];}
};
可以看的出来,思路完全就是跟记忆化搜索大差不差,所以对于暴搜改记忆化,记忆化改动态规划简直不要太方便。
3. 最⻓递增⼦序列(medium)

解析:
解法一:暴搜

决策树暴搜:dfs
class Solution {
public:int n,ret=1;bool visit[2501];int lengthOfLIS(vector<int>& nums) {n=nums.size();for(int i=0;i<n;i++){dfs(nums,i,1);}return ret;}void dfs(vector<int>& nums,int pos,int k){for(int i=pos+1;i<n;i++){if(visit[i]==false&&nums[pos]<nums[i]){k++;visit[i]=true;ret=max(ret,k);dfs(nums,i,k);visit[i]=false;k--;}}}
};
记忆化暴搜:
利用动态规划的思想,但是这是个决策树,要往记忆化的方向去靠近,那么就是从上往下的递归,然后求值并存入备忘录。这里只考虑暴搜的结果传入从i位置开始的结果,进去后开始考虑下一个值是选取哪一个位置的值,进行判断条件,因为进入dfs后当层的ret就都是要求出当前层ret的最大值:判断条件
if(nums[i]>nums[pos]);
因为dfs要返回当前层后面的最长子序列,所以用ret接受dfs的返回值:
ret=max(ret,dfs(nums,i)+1);
class Solution {
public:int lengthOfLIS(vector<int>& nums) {int ret=0;for(int i=0;i<nums.size();i++) ret=max(ret,dfs(nums,i));return ret;}int dfs(vector<int>& nums,int pos){int ret=1;for(int i=pos+1;i<nums.size();i++){if(nums[i]>nums[pos]){ret=max(ret,dfs(nums,i)+1);}}return ret;}
};
那么这个暴搜绝对会超时,因为在整个非常大的树的时候,会进行完全展开,出现很多重复性的子问题,会对很多已经被展开的树再次进行展开,时间复杂度大大增加。
解法二:记忆化搜索
class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n=nums.size();vector<int> memo(n);int ret=0;for(int i=0;i<nums.size();i++) ret=max(ret,dfs(nums,i,memo));return ret;}int dfs(vector<int>& nums,int pos,vector<int>& memo){if(memo[pos]) return memo[pos];int ret=1;for(int i=pos+1;i<nums.size();i++){if(nums[i]>nums[pos])ret=max(ret,dfs(nums,i,memo)+1);}memo[pos]=ret;return ret;}
};
解法三:动态规划
记忆化搜索改动态规划,其实再两个代码内可以看出是一一对应的,我们要求出当前位置的最长子序列就要通过最后面的值往前遍历,来从长度为1开始往前求,才能更好的求出dp[i]位置的长度。
那么当从最后一个数往前求的时候,唯一可以顾及到的就是当前数的后面的所有数。也就是当前位置的决策树。进行展开就是一个小的决策树。就是dp[i],dp[j]+1取最大值,此时的for(j)是从nums[i]后面的所有值开始的。
class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n=nums.size();vector<int> dp(n,1);//依赖后面的值,所以从后往前填表int ret=0;for(int i=n-1;i>=0;i--){for(int j=i+1;j<n;j++)if(nums[j]>nums[i]) dp[i]=max(dp[i],dp[j]+1);ret=max(ret,dp[i]);}return ret;}
};
4. 猜数字⼤⼩II(medium)

解析:


解法一:暴搜dfs

if(left>=right) return 0;
暴搜:dfs(1,n) 传入可以随机取值的区间范围,然后进行猜数字游戏
猜出所有数字的情况,head作为头节点,如果大了,就定义x去[left,head-1]位置去找,如果小了就定义y去[head+1,right]区间去找,然后都返回的是两边的最小值,让用到的钱最小,然后对两边的值取最大max(x,y) 这样能保证,这个最小值里面的最大值可以让当前层的所有花费都被满足,但是当前层后续有很多种随机取值的方式,所以我们要考虑到最便宜的一种就是最后当前层随机取值的所有情况都要取min
class Solution {
public:int getMoneyAmount(int n) {return dfs(1,n);}int dfs(int left,int right){if(left>=right) return 0;int ret=INT_MAX;for(int head=left;head<right;head++){int x=dfs(left,head-1);int y=dfs(head+1,right);ret=min(head+max(x,y),ret);}return ret;}
};
解法二:记忆化搜索
其实大差不差,就是专门添加一个备忘录:
只要写出来暴搜的过程,改成记忆化简直易如反掌
1.添加备忘录,然后判断当前值的取值范围[left][right]是否再备忘录内出现过?
2.每次再该层的取值范围进行返回前,先存入到备忘录内:
memo[left][right]=ret;
class Solution {
public:int memo[201][201];int getMoneyAmount(int n) {return dfs(1,n);}int dfs(int left,int right){if(left>=right) return 0;if(memo[left][right]) return memo[left][right];int ret=INT_MAX;for(int head=left;head<right;head++){int x=dfs(left,head-1);int y=dfs(head+1,right);ret=min(head+max(x,y),ret);}memo[left][right]=ret;return ret;}
};
5. 矩阵中的最⻓递增路径(hard)


解法一:暴搜
不用想肯定会超时,但是思路是简单的,只需要再主函数内任意传入一个位置的值,然后开始遍历上下左右,开始返回能够进入当前位置的最大长度,一直让ret取到当前位置的最大长度即可。
class Solution {
public:int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int n,m;int longestIncreasingPath(vector<vector<int>>& matrix) {m=matrix.size(),n=matrix[0].size();int ret=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){ret=max(ret,dfs(matrix,i,j));}}return ret;}int dfs(vector<vector<int>>& matrix,int i,int j){int ret=1;for(int k=0;k<4;k++){int x=dx[k]+i;int y=dy[k]+j;if(x>=0&&x<m&&y>=0&&y<n&&matrix[x][y]>matrix[i][j]){ret=max(ret,dfs(matrix,x,y)+1);}}return ret;}
};
解法二:记忆化搜索
跟上面题目一样,只需要添加上备忘录:
1.进入dfs判断是否存在当前值再备忘录内,如果存在就直接返回,不存在就进行添加;
2.每次到dfs函数底部进行返回前,只需要将当前值进行存入即可。
class Solution {
public:int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int n,m;int memo[201][201];int longestIncreasingPath(vector<vector<int>>& matrix) {m=matrix.size(),n=matrix[0].size();int ret=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){ret=max(ret,dfs(matrix,i,j));}}return ret;}int dfs(vector<vector<int>>& matrix,int i,int j){if(memo[i][j]) return memo[i][j];int ret=1;for(int k=0;k<4;k++){int x=dx[k]+i;int y=dy[k]+j;if(x>=0&&x<m&&y>=0&&y<n&&matrix[x][y]>matrix[i][j]){ret=max(ret,dfs(matrix,x,y)+1);}}memo[i][j]=ret;return ret;}
};
总结一下吧~学到现在,递归章节也算是告一段落了,我个人的进步确实有了质的变化,我自己能感受到,对于这一专题,可以很明显的看出,在遇到重复子问题,并且求关于路径个数,最长长度,多少次数之类的问题,都是要对整个决策树进行完整的遍历和取最值,但是在遍历过程种都会遇到很多重复遍历的问题,对于这种重复遍历的问题的次数,我们只需要往动态规划方面考虑的思路,这里不同于前几个章节的直接深度优先遍历,利用visit数组来判断还需不需要进入下一层,那个属于floodfill算法,要求分块的面积或者分块的个数,所以还是要好好进行区分总结!!!
希望对你也有帮助~
相关文章:

专题十三_记忆化搜索_算法专题详细总结
目录 1. 斐波那契数(easy) 那么这里就画出它的决策树 : 解法一:递归暴搜 解法二:记忆化搜索 解法三:动态规划 1.暴力解法(暴搜) 2.对优化解法的优化:把已经计算过的…...

已发布金融国家标准目录(截止2024年3月)
已发布金融国家标准目录2024年3月序号标准编号标准名称...

【论文#快速算法】Fast Intermode Decision in H.264/AVC Video Coding
目录 摘要1.前言2.帧间模式决策概览2.1 H.264/AVC中的帧间模式决策2.2 发现和动机 3.同质性和平稳性的确定3.1 同质性区域的确定3.2 稳定性区域的决定3.3 整体算法 4.实验结果4.1 IPPP序列的测试4.2 IBBP序列测试 5.结论 《Fast Intermode Decision in H.264/AVC Video Coding》…...

Git核心概念图例与最常用内容操作(reset、diff、restore、stash、reflog、cherry-pick)
文章目录 简介前置概念.git目录objects目录refs目录HEAD文件 resetreflog 与 reset --hardrevert(撤销指定提交)stashdiff工作区与暂存区差异暂存区与HEAD差异工作区与HEAD差异其他比较 restore、checkout(代码撤回)merge、rebase、cherry-pick 简介 本文将介绍Git几个核心概念…...

【人工智能在医疗企业个人中的应用】
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

IPv4头部和IPv6头部
IPv4和IPv6是互联网协议(IP)中的两个主要版本,它们在数据包头部(Header)结构上存在显著差异。以下是IPv4头部和IPv6头部的主要结构和区别: IPv4头部结构 IPv4(Internet Protocol Version 4&…...

从零开始手把手带你训练LLM保姆级教程,草履虫都能学会!零基础看完这篇就足够了~
导读 ChatGPT面世以来,各种大模型相继出现。那么大模型到底是如何训练的呢,在这篇文章中,我们将尽可能详细地梳理一个完整的 LLM 训练流程,包括模型预训练(Pretrain)、Tokenizer 训练、指令微调࿰…...

strcat函数追加字符串
char * strcat ( char * destination, const char * source ); dest:目标字符串,即要将源字符串追加到其末尾的字符串。src:源字符串,即要追加到目标字符串末尾的字符串 使用strcat函数给目标字符串追加字符时,首先要…...

每月洞察:App Store 和 Google Play 的主要更新
Google Play 和 App Store 的算法不断发展,定期更新和变化会显着影响其功能。对于开发人员和营销人员来说,跟上这些变化至关重要,因为它们会直接影响应用发现和排名。 本文将深入探讨 Google Play 和 App Store 的最新更新,解释它…...

【python openai function2json小工具】
两种方法 一种openai-swarm中提供的、一种langchain实现的 一、openai工具函数调用 import inspectdef merge_chunk(final_response: dict, delta: dict) -> None:delta.pop("role", None)merge_fields(final_response, delta)tool_calls delta.get("tool_…...

super()和super().__init__()的解释
一、super 1.基本概念 在python继承当中,super()函数主要用在子类中调用父类的方法。它返回一个特殊对象,这个对象会帮我们调用父类方法 class Parent:def __init__(self, name):self.name namedef say_hello(self):print(f"Hello, Im {self.nam…...

【C++】—— 多态(下)
【C】—— 多态(下) 4 多态的原理 4.1 虚函数表指针4.2 多态的原理4.3 动态绑定和静态绑定 4.4 虚函数表 4 多态的原理 4.1 虚函数表指针 我们以一道题来引入多态的原理 下面编译为 32 位程序的运行结果是什么() A、编译报错 B…...

idea 2023 配置 web service
前言 能在网上查到的资料,都是比较老的,搞了一上午才配置好了环境 因此记录一下,服务你我他 我的环境: java 1.8,Idea2023.1 配置web service 服务端 直接新建一个java新项目 下载插件 添加框架支持 启动项目 配置web service 客户端 新建项目,下载三个插件的步骤和上面服务…...

MYSQL数据库SQL+DQL
关于MySQL数据库中的SQL和DQL,以下是一些关键信息: SQL概述 SQL(Structured Query Language,结构化查询语言)是用于操作关系型数据库的编程语言。它定义了一套操作关系型数据库的统一标准。SQL语句可以单行或多行书写…...

Java中的异常Throwable
原文链接https://javaguide.cn/java/basis/java-basic-questions-03.html#%E5%BC%82%E5%B8%B8 Java 异常类层次结构图 Exception 和 Error 的区别 在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。Throwable 类有两个重要的子类: Excep…...

Day4顺序表c++代码实现
代码中实现,顺序表的初始化,插入,查找,删除 废话不多说,直接上 #include<iostream> using namespace std; #define eleType int struct SequentialList {eleType* elements;//指针int size;int capacity;//容量…...

将图片转换成base64格式
1.先创建一个canvas对象,然后给canvas对象设置图片对象的宽高,再调用canvas的getContext获取2d上下文对象,再调用上下文对象的drawImage方法,再通过canvase对象的toDataURL方法,将图片转换成base64格式的字符串 2.将b…...

征服ES(ElasticSearch)的慢查询实战
在 Elasticsearch(ES)中,进行大数据查询时,常常会由于多种因素而导致性能显著下降。接下来,我们将深入探讨几种常见情况及其相应的解决方案。 一、常见问题分析 深分页、大排序 大量数据扫描与多分片上的多次排序会严…...

如何才能从普通程序员转行AI大模型?
人工智能已经成为一个非常火的方向。作为一名普通的程序员,该如何转向AI大模型方向。以程序员为例,看看普通程序员如何开启AI大模型之路。 接下来给大家分享一下程序员转大模型的一些注意点: 作为一名程序员,在考虑转行至大模型领…...

【番外】软件设计师中级笔记关于数据库技术更新笔记问题
提问 由于软件设计师中级笔记中第九章数据库技术基础的笔记内容太多,我应该分几期发布呢?还是一期一次性发布完成。 如果分为一期发布,可能需要给我多一些时间,由于markdown格式有所差异,所以我需要部分进行修改与调…...

【代码】约瑟夫问题——故事背景
Hello!大家好,我是学霸小羊,今天先来讲讲约瑟夫问题的背景。 在古罗马时期,犹太历史学家约瑟夫斯领导犹太人反对罗马帝国的统治,并与罗马军队进行激烈的战斗。然而,在罗马军队的围困下,约瑟夫与…...

什么是事件冒泡和事件捕获
文章目录 1. 事件传播机制2. 事件冒泡(Event Bubbling)3. 事件捕获(Event Capturing)4. 事件冒泡和事件捕获的区别5. 阻止事件传播总结 事件冒泡和事件捕获是两种处理网页中事件传播的机制,特别是在 JavaScript 中处理…...

高端优质建站公司具备哪些优势?2024高端建站公司哪家好
从某种程度上讲,一个出色的建站公司需具备将无形的品牌价值巧妙转化为直观视觉元素的能力,这一转化过程极为考究,涵盖了设计的精细程度、色彩运用的巧妙以及空间布局的智慧,这些要素均不容忽视。 接下来考察网站的内容策划能力同…...

word删除空白页 | 亲测有效
想要删掉word里面的末尾空白页,但是按了delete之后也没有用 找了很久找到了以下亲测有效的方法 1. 通过鼠标右键在要删除的空白页面处显示段落标记 2. 在字号输入01,按ENTER(回车键) 3.成功删除了!!...

YashanDB学习-服务启停
YashanDB学习-服务启停 1、查看YashanDB 当前实例状态和数据库名称2、使用 yasboot 工具启停YashanDB3、服务器重启后无法通过yasboot命令运维管理数据库4、正常关闭数据库的方式 数据库安装过程中将实例自动切换成OPEN阶段,并创建名为yashandb的数据库。 1、查看Ya…...

在未排序的整数数组找到最小的缺失正整数
🎁👉点击进入文心快码 Baidu Comate 官网,体验智能编码之旅,还有超多福利!🎁 🔍【大厂面试真题】系列,带你攻克大厂面试真题,秒变offer收割机! ❓今日问题&am…...

TCP连接管理机制:三次握手四次挥手
🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 连接管理机制三次握手三次握手的目的三次握手的步骤第一次握手第二次握手第三次握手注意: 为什么建立连接是三次握手&…...

1022. 宠物小精灵之收服
思路 双层dp 代码 #include <bits/stdc.h> using namespace std;const int N 1010, mod 1e9 7;int n, m, k, x, y, z, ans, t; int w[N], f[N][N];void solve() {cin >> n >> m >> k;for (int i 1; i < k; i ){cin >> x >> y;f…...

人工智能生成内容(AI-Generated Content)
此外,ALGC还在影视剧本创作、音乐创作、设计与创意、虚拟助手与聊天机器人、教育与培训、新闻报道与文学创作等领域发挥着重要作用。 三、技术架构 ALGC产业生态体系通常呈现为上中下三层架构: 四、优势与挑战 优势: 挑战: 一、…...

深度学习:强化学习(Reinforcement Learning, RL)详解
强化学习(Reinforcement Learning, RL)详解 强化学习是机器学习的一个重要分支,它涉及到智能体(agent)通过与环境(environment)的交互学习如何做出决策。在强化学习中,智能体在不断…...