017搜索之深度优先搜索——算法备赛
深度优先搜索
如果说广度优先搜索是逐层扩散,那深度优先搜索就是一条道走到黑。
深度优先遍历是用递归实现的,预定一条顺序规则(如上下左右顺序) ,一直往第一个方向搜索直到走到尽头或不满足要求后返回上一个叉路口按第二个方向继续搜索,以此类推,直到所有节点都遍历到。
简单回溯
N皇后
问题描述:
设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。
这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。
原题链接
思路分析
N皇后问题是dfs的经典问题。
对于每一行,皇后都有N(N列)种放法,对于每一行遍历每一种位置,如果它与前面某一行的皇后处在同一列或同一对角线那就不能摆放在该位置;否则可以摆放在该位置,进行下一行的摆放。
vector<int>x; //存储第i行皇后所在列
vector<vector<string>>tar;
vector<string>tr;
int sum=0,s;
bool check(int k){for(int i=1;i<k;i++){if(x[k]==x[i]) return false; //判断该行的皇后是否与前面的皇后在同一列if(abs(x[k]-x[i])==k-i) return false; //判断该行的皇后是否与前面的皇后在同一对角线}return true;
}
void DFS(int t){if(t>s) { //当m>s时,该方案满足条件。sum++; //记录方案数。tar.push_back(tr);}else{for(int i=1;i<=s;i++){x[t]=i;tr[t-1]="";tr[t-1].insert(0,s,'.');tr[t-1][i-1]='Q'; //修改该行状态if(check(t)) DFS(t+1); //符合条件 开始下一行的摆放。 不合条件则摆在下一列。}}
}
vector<vector<string>> solveNQueens(int n) {s=n;x.resize(n+1);tr.resize(n);DFS(1); //从第一行开始搜索return tar;
}
路径之迷
蓝桥杯2016年国赛题
描述:
原题链接
代码
#include <bits/stdc++.h>
using namespace std;int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };
int n;
vector<int>rowCnt, colCnt;
bool allFlat = false;
vector<vector<bool>>vis;
vector<int>tar;bool checkEnd(int row, int col) {if (row != n - 1 || col != n - 1) return false;for (int i = 0; i < n; i++) {if (rowCnt[i]) return false; //有一个不为0,返回false}for (int i = 0; i < n; i++) {if (colCnt[i]) return false; //有一个不为0,返回false}allFlat = true;return true;
}bool check(int row, int col) {if (row < 0 || row >= n || col < 0 || col >= n|| vis[row][col]) return false; //越界或走到已走过的节点if (rowCnt[row] <= 0 || colCnt[col] <= 0) return false; //箭用完了return true;
}void dfs(int row, int col) {if (checkEnd(row, col) || allFlat) return; //结束for (int i = 0; i < 4; i++) {int x = row + dx[i];int y = col + dy[i];if (check(x,y)) {vis[x][y] = true;rowCnt[x]--, colCnt[y]--;tar.push_back(x * n + y); //第x行,第y列的节点编号为 x * n + ydfs(x, y);if (allFlat) return; //allFlat为true,不用继续执行了vis[x][y] = false; //回溯,还原现场rowCnt[x]++, colCnt[y]++;tar.pop_back();}}
}
int main()
{cin >> n;rowCnt = vector<int>(n);colCnt = vector<int>(n);vis = vector<vector<bool>>(n, vector<bool>(n));for (int i = 0; i < n; i++)cin >> colCnt[i];for (int i = 0; i < n; i++)cin >> rowCnt[i];vis[0][0] = 1;colCnt[0]--;rowCnt[0]--;tar.push_back(0);dfs(0, 0);for (auto i : tar) {cout << i << " ";}return 0;
}
简单正则问题
蓝桥杯2017年省赛题
问题描述
考虑一种简单的正则表达式:只由 x
,(
,)
,|
组成的正则表达式。求这个正则表达式能接受的最长字符串的长度?
例((xx|xxx)x|(x|xx))xx
能接受的最长字符串是xxxxxx,长度是6.
原题链接
思路分析
()
规定了运算的优先级最高,|代表长度取max,x代表一个字符- 根据嵌套规则,设计dfs
- 自底向上画出问题的二叉树,以
((xx|xxx)x|(x|xx))xx
为例
代码
#include<bits/stdc++.h>using namespace std;string s;
int k = 0;int dfs()
{int res = 0; //统计当前层可以容纳多少xwhile(k < s.size()){if(s[k] == '('){k++; //跳过左括号res += dfs(); //遇到括号,把括号中的值求出,再与res做+运算 k++; //跳过右括号}else if(s[k] == '|'){k++; //跳过 或 运算res = max(res, dfs()); //遇到或运算,把|右边的求出,再与res做max运算}else if(s[k] == ')') break; else{k++; res++; //遇到单个x,res直接加1}}return res;
}int main()
{cin >> s;cout << dfs() << endl;return 0;
}
记忆化搜索
掷骰子等于目标数的方法数
问题描述
这里有 n
个一样的骰子,每个骰子都不一样,每个骰子上都有 k
个面,分别标号为 1
到 k
。
给定三个整数 n
、k
和 target
,请返回投掷骰子的所有可能得到的结果中(总共有 k^n
种方式),使得骰子面朝上的数字总和等于 target
的结果数。
由于答案可能很大,你需要对 109 + 7
取模。
原题链接
思路分析
枚举第n个筛子的点数为x,那么这种情况的结果数就是前 n-1
个筛子点数和为target-x
的结果数。
那可以很自然地想到定义dp[i][j]
表示前i个筛子点数和为j的结果数,dp[i][j]=sum(dp[i-1][j-x]) , x为枚举的第i个筛子的点数
。
动态规划的过程可以使用直观一点的记忆化搜索。
代码
int numRollsToTarget(int n, int k, int target) {int mod=1e9+7;vector<vector<int>>dp(n+1,vector<int>(target+1));auto dfs=[&](auto dfs,int st,int sum)->int{if(dp[st][sum]) return dp[st][sum];if(st==n){if(sum<=k){dp[n][sum]=1;return 1;}}int l=max(1,sum-(n-st)*k);int r=min(k,sum-(n-st));for(int i=l;i<=r;i++){dp[st][sum]=(dp[st][sum]+dfs(dfs,st+1,sum-i))%mod;}return dp[st][sum];};return dfs(dfs,1,target);
}
统计满足逆序对数量条件的排列数量
给你一个整数 n
和一个二维数组 requirements
,其中 requirements[i] = [endi, cnti]
表示这个要求中的末尾下标和 逆序对 的数目。
整数数组 nums
中一个下标对 (i, j)
如果满足以下条件,那么它们被称为一个 逆序对 :
i < j
且nums[i] > nums[j]
请你返回 [0, 1, 2, ..., n - 1]
的 排列 perm
的数目,满足对 所有 的 requirements[i]
都满足 perm[0..endi]
中恰好有 cnti
个逆序对。
由于答案可能会很大,将它对 109 + 7
取余 后返回。
思路分析
首先将问题分解为子问题。考虑示例 {n = 3, requirements = [[2,2],[0,0]] }
,整个排列 [0,2] 恰好要有 2 个逆序对。分情况进行讨论:
- 末尾元素为 0。由于 0 是最小元素,前面的两个元素,每个元素都会与 0 构成一对逆序对。此时,[0,1] 还需要贡献 0 对逆序对。
- 末尾元素为 1。前面的两个元素中,2 会与 1 构成一对逆序对。此时,[0,1] 还需要贡献 1 对逆序对。
- 末尾元素为 2。前面的两个元素中,任何元素都不能和 2 构成逆序对。此时,[0,1] 还需要贡献 2 对逆序对。
定义函数 dfs(end,cnt)
,用来计算排列逆序对为 cnt 且满足 requirements
的排列 perm[0…end]
的个数。代入示例 ,我们可以得到 dfs(2,2)=dfs(1,0)+dfs(1,1)+dfs(1,2)
的递推公式。
更一般地,计算dfs(end,cnt)
,我们可以得到以下递推公式:
- 如果
[0,end−1]
在requirements
有要求逆序对数量,且对应的逆序对要求数量为r
,那么我们在计算dfs(end,cnt)
时,因为[0,end-1]
的逆序对个数为r,前面的元素需要与最后一个元素贡献cnt−r
个逆序对,因为排列的每个元素都不一样,最后一个元素的取值要么不存在,要么唯一确定。这个逆序对的个数满足0≤cnt−r≤end
。因此,当满足r≤cnt≤end+r
时,dfs(end,cnt)=dfs(end−1,r)
;否则,dfs(end,cnt)=0
。 - 如果
end−1
不在requirements
有要求。那么我们遍历末尾元素所有的可能性。遍历的范围为0∼min(end,cnt)
,得到递推公式dfs(end,cnt)=∑ i=0,min(end,cnt) dfs(end−1,cnt−i)
。
注意需要对 dfs
应用记忆化搜索,定义数组memo
,meno[i][j]
存储dfs(i,j)的计算结果,这样每个状态最多被计算一次,降低时间复杂度。
最后返回 dfs(n−1,reqMap[n−1])
即可,其中 reqMap
是将 requirements
转化成的键值对,键为 endi
,值为 cnti
。
代码
int numberOfPermutations(int n, vector<vector<int>>& requirements) {const int MOD = 1e9+7;vector<int> req(n, -1);req[0] = 0;for (auto& p : requirements) {req[p[0]] = p[1];}if (req[0]) {return 0;}int m = ranges::max(req);vector<vector<int>> memo(n, vector<int>(m + 1, -1)); // -1 表示没有计算过auto dfs = [&](auto&& dfs, int i, int j) -> int {if (i == 0) {return 1; //i为0,直接返回1}int& res = memo[i][j]; // 注意这里是引用if (res != -1) { // 之前计算过return res;}res = 0;if (int r = req[i - 1]; r >= 0) { //r大于0,说明在req中有逆序对数量要求if (j >= r && j <= r + i) { //对于满足要求的j,res值唯一确定,继承前者dfs(i-1,r)。res = dfs(dfs, i - 1, r);}} else {for (int k = 0; k <= min(i, j); k++) { //前面元素和当前最后一位组成k对逆序对,最多不会超过i。res = (res + dfs(dfs, i - 1, j - k)) % MOD; //对于每个枚举的k,前面元素需组成j - k对逆序对}}return res;};return dfs(dfs, n - 1, req[n - 1]);}
剪枝技巧
组合总数
问题描述
给你一个 无重复元素 的整数数组 candidates
和一个目标整数 target
,找出 candidates
中可以使数字和为目标数 target
的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates
中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target
的不同组合数少于 150
个。
原题链接
代码
vector<vector<int>>tar;vector<int>tr;int s;void dfs(vector<int>& c,int begin,int t){if(t==0) {tar.push_back(tr);return;}/*在搜索中去重,每一次搜索的时候设置 下一轮搜索的起点 begin从每一层的第 2 个结点开始,都不能再搜索产生同一层结点已经使用过的 candidate 里的元素。*/for(int i=begin;i<s&&t-c[i]>=0;i++){ //t-c[i]>=0,减枝tr.push_back(c[i]);dfs(c,i,t-c[i]); tr.pop_back(); //回朔}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {s=candidates.size();if(s==0) return tar;sort(candidates.begin(),candidates.end()); //排序是剪枝的前提dfs(candidates,0,target);return tar;}
买瓜
蓝桥杯2023年省赛题
问题描述
小蓝在瓜摊上买瓜。瓜摊上共有n个瓜,每个瓜的重量为Ai,小蓝可以把任何瓜劈成完全等重的两份,不过每个瓜最多劈一刀。小蓝希望买的瓜的重量之和为m。输出小蓝至少要劈多少个瓜才能买到总重量恰好为m的瓜,如果无论如何都无法得到总重量恰好为m的瓜,则输出-1。
原题链接
思路分析
每个西瓜可以有1.选整个,2.不选,3.选一半 三种选择,枚举所有总重量等于m的组合方案,选出劈瓜数最少得那个。如果纯暴力的话,总复杂度将达到O(3^n).
可通过剪枝来优化一下时间复杂度:
- 选取的瓜的总重量已经大于等于m,可以不用继续【递】下去,直接【归】。
- 维护一个最小劈瓜数ans,当前劈瓜数已经大于等于ans时不用再【递】下去,直接【归】。
- 定义一个后缀数组sum,记录sum[i]记录
[i,n-1]
区间内所有西瓜的总重量,当前面选取西瓜重量+后面所有西瓜总重量都不足以等于m时不用再【递】下去,直接【归】。
代码
#include <bits/stdc++.h>
using namespace std;int ans=50;//ans维护最小劈瓜数 先设为一个大值int a[50];//存瓜 原数组int sum[50];//表示的是从第 i 个瓜到第 n 个瓜的总质量int n,m;void dfs(int S,int i,int cnt)//总和,下标,劈瓜计数器
{if(cnt>=ans)return;//剪枝if(S==m) ans=min(ans,cnt);//如果相等,说明劈瓜劈够了,返回已经劈了几次瓜if(i>=n||S>=m||S+sum[i]<m) return ;//递归结束条件dfs(S+a[i],i+1,cnt);//买一个瓜dfs(S+a[i]/2,i+1,cnt+1);//买半个瓜,计数器+1dfs(S,i+1,cnt);//不买当前瓜,跳到下一个瓜
}
int main()
{ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n>>m;m<<=1;//总质量也要*2才能保证结果不受影响for(int i=0;i<n;i++) cin>>a[i],a[i]<<=1;//为了防止劈瓜出现小数,将其左移一位*2倍//遍历所有的瓜for(int i=n-1;i>=0;i--){sum[i]=sum[i+1]+a[i];//记录后缀数组}dfs(0,0,0);if(ans==50)cout<<-1; //最终 ans 仍然为初始值 50,则表示无法通过劈瓜的方式满足要求else cout<<ans;return 0;
}
相关文章:

017搜索之深度优先搜索——算法备赛
深度优先搜索 如果说广度优先搜索是逐层扩散,那深度优先搜索就是一条道走到黑。 深度优先遍历是用递归实现的,预定一条顺序规则(如上下左右顺序) ,一直往第一个方向搜索直到走到尽头或不满足要求后返回上一个叉路口按…...
从单机到集群,再到分布式,再到微服务
我会尽量详细讲解,从单机到集群,再到分布式和微服务每个层次的概念、特点和应用场景。同时也会探讨C是否适合做微服务项目。 一、从单机到集群,再到分布式,再到微服务——详细解析 1. 单机(Single Machine)…...
关于ios点击分享自动复制到粘贴板的问题
前言 Android 系统没有什么特别的要求,实现这个也比较容易。但ios在某些情况下就会出现问题。 如果ios是点击之后,请求接口,再把接口的内容赋值给粘贴板肯定行不通,会被ios系统拦截,导致赋值失败或者赋值为空。建议使…...
Hive的JOIN操作如何优化?
Hive的JOIN操作优化是提升查询性能的关键,尤其是在处理大数据量时。以下是详细的JOIN优化策略和实现方法: 一、MapJoin(小表广播优化) 核心原理 将小表全量加载到每个MapTask的内存中,避免Shuffle,直接在…...
React Native 实现抖音式图片滑动切换浏览组件-媲美抖音体验的滑动式流畅预览组件
写在前面 “如何让用户像刷抖音一样浏览我们的图片列表?” —— 这个需求背后隐藏着性能、体验和交互设计的多重挑战。本文将带你从零实现一个高性能的React Native图片浏览器,支持分页预加载、横向滑动预览、文字展示和缓存优化,打造媲美原…...

睿抗机器人开发者大赛CAIP-编程技能赛-历年真题 解题报告汇总 | 珂学家
前言 汇总 睿抗机器人开发者大赛CAIP-编程技能赛-历年真题 解题报告汇总 2024年 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组 (国赛) 解题报告 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)解题报告 2024 睿抗机器人开发者大赛CAI…...

【c++】【数据结构】AVL树
目录 AVL树的定义AVL树的部分模拟实现平衡因子的引入平衡因子的向上调整旋转算法单旋算法右单旋左单旋 双旋算法左右双旋右左双旋 AVL树的定义 AVL树本质是一种搜索二叉树,传统的二叉搜索树我们都有所了解,其在理想情况下也就是接近满二叉树时拥有极高的…...
【原神 × 插入排序】刷圣遗物也讲算法:圣遗物评分系统背后的排序逻辑你真的懂吗?
📘 改编自:王争《数据结构与算法之美》 🎮 游戏演绎:米哈游《原神》 🧠 核心关键词:插入排序、排序算法、评分系统、属性评价、强化圣遗物、冒泡排序对比 🧭 引言:原神刷本=刷排序? 玩《原神》的玩家每天日常是啥?体力用来刷圣遗物、精通头、暴击头、攻充沙………...
ORB-SLAM2学习笔记:ExtractorNode::DivideNode和ORBextractor::DistributeOctTree函数详解
一、ExtractorNode::DivideNode void ExtractorNode::DivideNode(ExtractorNode &n1, ExtractorNode &n2, ExtractorNode &n3, ExtractorNode &n4) {const int halfX = ceil(static_cast<float>(UR.x-UL.x)/2);const int halfY = ceil(static_cast<f…...
nt!MmMapViewInSystemCache函数分析PointerPte的填充
第一部分: 1: kd> kc # 00 nt!MmMapViewInSystemCache 01 nt!CcGetVacbMiss 02 nt!CcGetVirtualAddress 03 nt!CcMapData 04 Ntfs!NtfsMapStream 05 Ntfs!NtfsReadBootSector 06 Ntfs!NtfsMountVolume 07 Ntfs!NtfsCommonFileSystemControl 08 Ntfs!NtfsFspDis…...
3D Tiles高级样式设置与条件渲染(3)
二、基于地理距离的条件渲染 1.根据与特定点的距离设置样式 在某些应用中,我们可能需要根据建筑物与某个特定点(如地标建筑)的距离来设置样式。以下代码示例展示了如何根据建筑物与广州塔的距离来设置颜色和可见性: tiles3d.styl…...

通义灵码深度实战测评:从零构建智能家居控制中枢,体验AI编程新范式
一、项目背景:零基础挑战全栈智能家居系统 目标:开发具备设备控制、环境感知、用户习惯学习的智能家居控制中枢(PythonFlaskMQTTReact) 挑战点: 需集成硬件通信(MQTT)、Web服务(Flask)、前端交互(React) 调用天气AP…...

头歌之动手学人工智能-Pytorch 之优化
目录 第1关:如何使用optimizer 任务描述 编程要求 测试说明 真正的科学家应当是个幻想家;谁不是幻想家,谁就只能把自己称为实践家。 —— 巴尔扎克开始你的任务吧,祝你成功! 第2关:optim.SGD 任务描述…...

基于谷歌ADK的智能客服系统简介
Google的智能体开发工具包(Agent Development Kit,简称ADK)是一个开源的、以代码为中心的Python工具包,旨在帮助开发者更轻松、更灵活地构建、评估和部署复杂的人工智能智能体(AI Agent)。ADK 是一个灵活的…...

(一)视觉——工业相机(以海康威视为例)
一、工业相机介绍 工业相机是机器视觉系统中的一个关键组件,其最本质的功能就是将光信号转变成有序的电信号。选择合适的相机也是机器视觉系统设计中的重要环节,相机的选择不仅直接决定所采集到的图像分辨率、图像质量等,同时也与整个系统的运…...

DAY 36 超大力王爱学Python
仔细回顾一下神经网络到目前的内容,没跟上进度的同学补一下进度。 作业:对之前的信贷项目,利用神经网络训练下,尝试用到目前的知识点让代码更加规范和美观。探索性作业(随意完成):尝试进入nn.Mo…...
基于React + TypeScript构建高度可定制的QR码生成器
前言 在现代Web应用中,QR码已成为连接线上线下的重要桥梁。本文将详细介绍如何使用React TypeScript Vite构建一个功能强大、高度可定制的QR码生成器,支持背景图片、文本叠加、HTML模块、圆角导出等高级功能。 前往试试 项目概述 技术栈 前端框架:…...
DeepSeek进阶教程:实时数据分析与自动化决策系统
进阶教程:实时数据分析与自动化决策系统 1. 实时数据流处理架构 class StreamProcessor:def __init__(self):self.window_size = 60 # 滑动窗口大小(秒)self.analytics_engine = AnalyticsEngine() # 复用之前的分析引擎def process_kafka_stream(self, topic):"&quo…...
visual studio 2022 初学流程
本文采用总-分的形式讲述流程 1.前端外部可以使用的接口 ExternalDataWebService.asmx?opReportWaterForWayder 新建ExternalDataWebService.asmx 文件 <% WebService Language"C#" CodeBehind"~/App_Code/ExternalDataWebService.cs" Class…...

SRD-12VDC-SL-C 继电器接线图解
这个继电器可以使用12伏的直流电源控制250伏和125伏的交流电,也可以控制30伏和28伏的直流电,电流都为10安。 此继电器有5个引脚,各个的作用如下: 引脚4和引脚5为触点, 引脚1和引脚3为线圈引脚,接12伏的直…...

基于开源链动2+1模式AI智能名片S2B2C商城小程序的企业组织生态化重构研究
摘要:本文以互联网时代企业组织结构变革为背景,探讨开源链动21模式AI智能名片S2B2C商城小程序在推动企业从封闭式向开放式生态转型中的核心作用。通过分析传统企业资源获取模式与网络化组织生态的差异,结合开源链动21模式的裂变机制、AI智能名…...
前端面经 两栏布局
两栏布局 float实现 1.给父盒子加float:hidden实现BFC 2.给左盒子加浮动float:left 给宽度 flex布局 1父盒子 display:flex 2左盒子 固定宽度 3.右盒子 flex:1 三栏布局 法1:浮动实现 1 父盒子overflow:hidden 实现BFC 2左盒子:float:left 3右盒子 :floa…...

2,QT-Creator工具创建新项目教程
目录 1,创建一个新项目 demo_01.pro(项目配置文件) 类似 CMakeList.txt widget.h(头文件) main.cpp(程序入口) widget.cpp(源文件) widget.ui(界面设计文件) 1,创建一个新项目 依次选择: 设置路径: 选择编译器: 如果选择CMake, 就会生成cmakel…...

《深入解析SPI协议及其FPGA高效实现》-- 第一篇:SPI协议基础与工作机制
第一篇:SPI协议基础与工作机制 1. 串行外设接口导论 1.1 SPI的核心定位 协议本质 : 全双工同步串行协议(对比UART异步、IC半双工)核心优势 : 无寻址开销(通过片选直连)时钟速率可达100MHz&…...

2025年5月6日 飞猪Java一面
锐评 鸡蛋鸭蛋荷包蛋 我的蛋仔什么时候才能上巅峰凤凰蛋? 1. 如何保证数据库数据和redis数据一致性 数据库数据和 redis 数据不一致是在 高并发场景下更新数据的情况 首先我们要根据当前保持数据一致性的策略来决定方案 如果采取的策略是先删除缓存 更新数据库 我们假设现…...
技术深度解析:《鸿蒙5.0+:AI驱动的全场景功耗革命》
引言:鸿蒙5.0的能效革新目标 行业挑战: 移动设备多设备协同需求激增,传统系统面临分布式通信开销、AI算力碎片化、边缘设备能效瓶颈等问题。鸿蒙5.0突破: 引入方舟引擎3.0(ArkTS编译优化…...
Nodejs+http-server 使用 http-server 快速搭建本地图片访问服务
在开发过程中,我们经常需要临时查看或分享本地的图片资源,比如设计稿、截图、素材等。虽然可以通过压缩发送,但效率不高。本文将教你使用 Node.js 的一个轻量级工具 —— http-server,快速搭建一个本地 HTTP 图片预览服务…...
Zsh/Bash Conda设置延迟启动,启动速度优化
Zsh/Bash 启动速度优化 在安装完 Conda 之后,会发现每次启动 Zsh/Bash 的时候都需要加载时间,这个时候就会发现没有以前流畅了,原因是因为每次启动 Shell 时都需要去加载 Conda 环境,才能保证每次可以使用工具。然而官方自带的安…...

【AI论文】推理语言模型的强化学习熵机制
摘要:本文旨在克服将强化学习扩展到使用 LLM 进行推理的主要障碍,即策略熵的崩溃。 这种现象在没有熵干预的RL运行中一直存在,其中策略熵在早期训练阶段急剧下降,这种探索能力的减弱总是伴随着策略性能的饱和。 在实践中ÿ…...
Java中的JSONObject详解:从基础到高级应用
Java中的JSONObject详解:从基础到高级应用 在当今前后端分离的架构中,JSONObject已成为Java开发者处理JSON数据的瑞士军刀。本文将深入解析JSONObject的核心机制与实战技巧。 一、JSONObject的本质与实现库 1.1 核心定位 JSONObject是Java中表示JSON对…...