树形动态规划入门:节点选择问题与状态转移方程详解
1. 从一道题看树形动态规划的核心思路节点选择这道题在蓝桥杯的算法训练题单里算是树形动态规划的入门经典。我第一次遇到它的时候第一反应是贪心——每次选权重最大的节点不就行了结果提交上去直接WA了一半的测试点。后来才想明白树上的节点之间存在父子约束关系选了父节点就不能选子节点这种带约束的优化问题贪心根本处理不了全局最优必须用动态规划来做。这道题的需求很明确给定一棵有N个节点的树每个节点有一个正整数的权值要求从中选出若干个节点使得选出的节点中任意两个都不相邻即没有直接的父子关系同时让选出的节点权值之和最大。说白了就是在树上做一个带约束的最大权独立集问题。它解决的是什么问题是资源调度中常见的互斥选择场景。比如公司团建安排选了部门主管就不能选他直接下属每个人对团建的贡献值不同怎么选让总贡献最大。再比如课程安排先修课和后续课不能同时选每门课学分不同怎么选学分最高。这类问题的本质都是树形结构上的互斥优化。适合谁来参考如果你已经掌握了基础的线性动态规划知道什么是状态转移方程但对树形结构上的DP还没有头绪那这道题就是最好的切入点。它不需要复杂的图论知识只要会写树的遍历理解递归和回溯就能把这道题吃透。我当初就是从这道题开始才真正理解了树形DP的套路。2. 树形DP的状态设计与转移方程推导2.1 为什么用DP而不是贪心或暴力先说说为什么贪心不行。假设一棵树根节点权值是10它有两个子节点权值分别是9和9。贪心策略如果每次选当前最大的会先选根节点10然后两个子节点都不能选了总和是10。但最优解是选两个子节点总和18。贪心在这里直接翻车。暴力枚举呢每个节点选或不选N个节点就是2的N次方种组合N稍微大一点就超时。蓝桥杯的题目N通常能到10的5次方级别暴力完全不可行。树形DP的核心思想是利用树的结构特性把问题分解到每棵子树上。对于任意一个节点它只有两种状态选它或者不选它。而它的选择会直接影响它的子节点能不能选。这种父子之间的依赖关系天然适合用递归的方式从叶子往上推导。2.2 状态定义的关键考量定义dp[u][0]表示以u为根的子树中不选节点u时能获得的最大权值和。dp[u][1]表示以u为根的子树中选节点u时能获得的最大权值和。为什么是二维的因为父节点的选择状态会约束子节点。如果父节点选了子节点就绝对不能选如果父节点没选子节点可选可不选。这个可选可不选就需要在子节点层面做决策所以每个节点需要记录两种状态下的最优值供父节点参考。这里有个容易踩的坑dp数组的含义是以u为根的子树而不是从u到某个节点的路径。很多初学者会把树形DP和树上路径问题搞混。子树是一个集合概念包含u以及u的所有后代节点而路径是一条链。这道题是子树问题不是路径问题。2.3 转移方程的完整推导对于叶子节点它没有子节点。dp[leaf][0] 0因为不选它就没有权值贡献。dp[leaf][1] weight[leaf]选它就获得它自己的权值。对于非叶子节点u假设它有若干个子节点v1, v2, ..., vk。如果选udp[u][1]那么所有子节点都不能选。每个子节点vi只能取dp[vi][0]。所以dp[u][1] weight[u] Σ dp[vi][0]。如果不选udp[u][0]那么每个子节点vi可以选也可以不选取两者中的较大值。所以dp[u][0] Σ max(dp[vi][0], dp[vi][1])。最终答案是max(dp[root][0], dp[root][1])因为根节点选不选都行取最优。这个转移方程看起来简单但里面有一个隐含的前提子节点之间的选择是相互独立的。在这道题里确实如此因为约束只存在于父子之间兄弟节点之间没有直接约束。如果题目改成选了某个节点它的兄弟节点也不能选那转移方程就要重新设计了。所以做题时一定要看清楚约束条件的作用范围。2.4 边界条件与初始化细节初始化的时候dp数组全部置为0。然后在DFS的过程中先递归处理所有子节点再根据子节点的返回值计算当前节点的dp值。这就是典型的后序遍历思路——先处理完所有孩子再处理自己。有一个细节需要注意dp[u][1]的初始值应该设为weight[u]而不是0。因为选u的话u本身的权值一定要算进去。我见过有人在递归里先把dp[u][1]置0然后累加子节点的dp[vi][0]最后忘了加weight[u]结果答案偏小。另外如果权值可能是负数虽然这道题说是正整数但有些变种题会出现负数那dp[u][0]的转移就要小心了。因为max(dp[vi][0], dp[vi][1])在负数情况下可能都是负的这时候不选任何子节点反而更好。不过这道题权值为正所以直接取max就行。3. 完整代码实现与逐行解析3.1 建树方式的选择树形DP的第一步是把树建出来。常见的建树方式有两种邻接表vector数组和链式前向星。对于蓝桥杯这种规模的题目用vector邻接表就够了写起来简单不容易出错。#include bits/stdc.h using namespace std; const int MAXN 100005; vectorint adj[MAXN]; int weight[MAXN]; long long dp[MAXN][2]; bool visited[MAXN];这里用long long存dp值因为N个节点的权值累加可能超过int范围。蓝桥杯的题目经常在数据范围上设坑权值虽然说是正整数但没说上限累加之后爆int是很常见的事。我当初就是用了int结果最后一个测试点WA改成long long就过了。visited数组用来标记节点是否被访问过防止在DFS过程中往回走。因为树是无向的建边的时候是双向的如果不标记递归会陷入死循环。3.2 DFS后序遍历的实现void dfs(int u) { visited[u] true; dp[u][0] 0; dp[u][1] weight[u]; for (int v : adj[u]) { if (!visited[v]) { dfs(v); dp[u][0] max(dp[v][0], dp[v][1]); dp[u][1] dp[v][0]; } } }这段代码的逻辑很清晰先标记当前节点已访问初始化dp值然后遍历所有邻居。对于未访问的邻居即子节点先递归处理再用子节点的结果更新当前节点的dp值。注意dp[u][1] dp[v][0]这一行。因为选了u就不能选v所以v只能取不选的状态。而dp[u][0] max(dp[v][0], dp[v][1])因为不选u的话v选不选都行取大的那个。这里有一个常见的错误把dp[u][1]的累加写成了dp[u][1] max(dp[v][0], dp[v][1])。这样写的话相当于选了u之后还能选v违反了题目约束。我当初检查了半天才发现是这个错误测试点过了但答案偏大就是因为这个。3.3 主函数的处理流程int main() { int n; cin n; for (int i 1; i n; i) { cin weight[i]; } for (int i 0; i n - 1; i) { int u, v; cin u v; adj[u].push_back(v); adj[v].push_back(u); } memset(visited, false, sizeof(visited)); dfs(1); cout max(dp[1][0], dp[1][1]) endl; return 0; }主函数先读入节点数和每个节点的权值然后读入n-1条边建树。因为是一棵树所以边数一定是n-1。建边的时候双向添加因为题目给的边不一定是从父到子的方向可能是任意方向。从节点1开始DFS因为节点1是根节点题目通常默认1是根或者任意节点都可以作为根因为树形DP的结果与根的选择无关。最后输出max(dp[1][0], dp[1][1])。有一个细节如果n0或者n1需要特判吗n1的时候只有一个节点答案是weight[1]。代码跑下来dfs(1)会设置dp[1][1]weight[1]dp[1][0]0最后输出max(0, weight[1])weight[1]没问题。n0的情况题目一般不会出现但保险起见可以加个判断。3.4 时间与空间复杂度分析时间复杂度是O(N)因为每个节点在DFS中只被访问一次每条边也被遍历两次双向边。空间复杂度是O(N)主要是邻接表和dp数组的开销。对于N10的5次方这个复杂度完全没问题跑起来很快。对比一下其他做法如果不用DP用记忆化搜索也能做本质上是一样的只是写法不同。如果用树的最小支配集或者其他图论算法反而会把问题复杂化。树形DP是这道题最自然、最高效的解法。4. 常见错误与调试经验实录4.1 递归爆栈问题N10的5次方的时候如果树退化成一条链递归深度会达到10的5次方层。在有些环境下系统栈可能撑不住导致段错误。我当初在本地跑的时候没问题但提交到评测机上就RE了。解决办法有两个一是手动开大栈空间比如在代码开头加#pragma comment(linker, /STACK:102400000,102400000)但这个只在某些编译器下有效。二是改成非递归的写法用栈模拟DFS或者用拓扑排序从叶子往上推。非递归的写法稍微复杂一点但更稳妥。思路是先用BFS或者栈求出拓扑序然后按逆序处理每个节点。因为树形DP需要先处理子节点再处理父节点所以逆拓扑序正好满足这个要求。void dfs_iterative(int root) { stackint st; vectorint order; st.push(root); visited[root] true; while (!st.empty()) { int u st.top(); st.pop(); order.push_back(u); for (int v : adj[u]) { if (!visited[v]) { visited[v] true; st.push(v); } } } reverse(order.begin(), order.end()); for (int u : order) { dp[u][0] 0; dp[u][1] weight[u]; for (int v : adj[u]) { if (v ! parent[u]) { dp[u][0] max(dp[v][0], dp[v][1]); dp[u][1] dp[v][0]; } } } }这个写法需要额外记录每个节点的父节点避免重复处理。虽然代码长了一点但不用担心栈溢出。4.2 输入输出超时问题蓝桥杯的题目有时候输入量很大用cin和cout可能会超时。我习惯在main函数开头加两行ios::sync_with_stdio(false); cin.tie(nullptr);这两行关闭了C流和C流的同步解除了cin和cout的绑定能显著提升输入输出速度。实测下来对于10的5次方级别的输入不加这两行可能要跑几百毫秒加了之后降到几十毫秒。如果还嫌慢可以用scanf和printf或者手写快速读入。不过对于这道题加了sync_with_stdio(false)基本就够了。4.3 答案偏大或偏小的排查思路答案偏大通常是转移方程写错了。最常见的是dp[u][1]累加的时候用了max(dp[v][0], dp[v][1])相当于允许父子同时选。检查一下这一行是不是写成了dp[u][1] dp[v][0]。答案偏小可能是漏加了weight[u]或者dp数组没有用long long导致溢出。还有一种可能是建树的时候只加了单向边导致有些节点没被遍历到。检查一下建边的时候是不是双向都加了。如果答案完全不对可能是根节点选错了。虽然理论上任意节点作为根都能得到正确答案但如果建树的时候边是单向的从错误的根出发可能遍历不到所有节点。建议建双向边然后从节点1开始DFS。4.4 多组测试数据的处理有些蓝桥杯的题目会有多组测试数据每组数据之间需要清空全局数组。我当初就踩过这个坑第一组数据跑完第二组数据的时候dp数组还残留着上一组的值导致答案错误。解决办法是在每组数据开始前把adj数组、weight数组、dp数组、visited数组全部清空。adj数组用vector的话可以遍历一遍clear或者直接重新声明。dp和visited用memset清空。for (int i 1; i n; i) { adj[i].clear(); } memset(dp, 0, sizeof(dp)); memset(visited, false, sizeof(visited));如果题目明确说只有一组数据那就不用管。但保险起见养成清空的好习惯总没错。5. 从节点选择延伸出的树形DP通用套路5.1 树形DP的识别特征什么样的题目适合用树形DP我总结了几条特征第一问题定义在一棵树上节点之间有层级关系。第二每个节点有选或不选两种状态或者有多种状态。第三父节点的选择会约束子节点的选择存在依赖关系。第四要求全局最优解而不是局部最优。节点选择这道题完美符合这四条。类似的题目还有没有上司的舞会本质和节点选择一模一样、战略游戏最小点覆盖、皇宫看守最小支配集等。这些题的状态设计和转移方程各有不同但核心思路都是树形DP。5.2 状态设计的通用方法树形DP的状态设计通常围绕当前节点的状态来展开。最简单的就是二状态选或不选。复杂一点的会有三状态比如选了且被父节点覆盖、选了但没被父节点覆盖、没选但被子节点覆盖等。设计状态的时候问自己几个问题当前节点的状态会影响哪些子节点的决策子节点的哪些信息需要传递给父节点父节点需要知道子节点的哪些状态才能做出最优决策以节点选择为例父节点需要知道子节点选和不选两种状态下的最优值因为父节点的选择会决定子节点能不能选。所以子节点需要把这两种状态都传递给父节点。5.3 转移方程的推导技巧推导转移方程的时候先固定当前节点的状态然后考虑在这个状态下子节点有哪些合法的状态可以选择。对于每种合法的子节点状态取最优值累加。比如节点选择中如果当前节点选了子节点只能不选所以累加dp[v][0]。如果当前节点没选子节点可以选也可以不选所以累加max(dp[v][0], dp[v][1])。这个思路可以推广到更复杂的情况。比如三状态的题目当前节点有状态0、1、2子节点有状态0、1、2先列出哪些状态组合是合法的然后对每种合法的组合取最优值。5.4 树形DP与线性DP的对比线性DP是在一条链上做决策状态转移只依赖于前一个或前几个状态。树形DP是在一棵树上做决策状态转移依赖于所有子节点的状态。线性DP通常用迭代的方式从左到右或者从右到左递推。树形DP通常用递归的方式从根到叶子再回溯到根。线性DP的状态转移是局部的树形DP的状态转移是全局的需要汇总所有子节点的信息。理解了这个区别就能明白为什么树形DP需要后序遍历。因为父节点的决策依赖于所有子节点的决策结果所以必须先把所有子节点处理完才能处理父节点。这就是后序遍历的本质。5.5 实战中的优化技巧如果题目数据量特别大递归写法可能会爆栈这时候可以用非递归的拓扑排序写法。如果题目要求输出方案而不只是最优值可以在DP过程中记录每个节点的选择最后回溯输出。如果题目中的树不是二叉树而是多叉树转移方程不变只是子节点的数量多了。如果题目中的树是带权边的状态设计可能需要考虑边的权值。如果题目中的约束不是父子互斥而是其他关系需要重新分析约束的作用范围。我个人的经验是树形DP的题目只要把状态定义清楚了转移方程推导出来了代码实现反而不是难点。难点在于识别题目是否适合树形DP以及如何设计出正确的状态。这需要多做题、多总结形成条件反射。6. 蓝桥杯算法训练中的实战建议6.1 刷题顺序的建议蓝桥杯的算法训练题单里树形DP的题目不算多但每道都很经典。建议的刷题顺序是先做节点选择最大权独立集再做战略游戏最小点覆盖最后做皇宫看守最小支配集。这三道题的状态设计从二状态到三状态难度递增循序渐进。节点选择是入门理解了二状态的设计和转移后面的题目就好办了。战略游戏的状态设计和节点选择类似只是目标从最大权值和变成了最小点数和。皇宫看守的状态设计更复杂需要三状态但核心思路还是一样的。6.2 比赛中的时间分配蓝桥杯比赛的时候树形DP的题目通常出现在中后期。如果前面的基础题做得顺利可以留出足够的时间来啃树形DP。但如果时间紧张建议先拿部分分比如暴力枚举小数据然后再优化。节点选择这道题暴力枚举能过N20的测试点大概能拿30%到40%的分。如果时间不够先写暴力拿分再改成树形DP拿满分。不要一上来就死磕满分结果其他题没时间做。6.3 调试技巧与测试用例设计调试树形DP的时候建议手动画一棵小树比如5个节点的树手动模拟DP过程看看每一步的dp值是否符合预期。如果不符合检查转移方程是不是写错了。测试用例的设计要覆盖几种情况链状树退化成一条链、星状树一个根多个叶子、平衡二叉树、随机树。链状树测试递归深度星状树测试子节点数量多的情况平衡二叉树测试一般情况。我习惯在本地写一个暴力程序随机生成小数据然后和树形DP的结果对拍。对拍能发现很多隐藏的错误比如边界条件没处理好、数组越界等。这个方法虽然土但非常有效。6.4 心态调整与经验积累树形DP的题目第一次做的时候可能会觉得无从下手。这很正常我当初也是看了别人的题解才明白的。关键是要理解状态设计的思路而不是死记硬背代码。做完一道题之后试着总结一下这道题的状态是怎么定义的转移方程是怎么推导的有没有类似的题目可以用同样的思路这样积累下来下次遇到新的树形DP题目就能快速找到切入点。蓝桥杯的算法训练重在质量而不是数量。把一道题吃透比刷十道题但每道都一知半解要强得多。节点选择这道题值得反复做几遍直到能闭着眼睛写出正确的转移方程为止。最后分享一个小技巧如果实在想不出状态怎么设计可以先考虑暴力解法然后观察暴力解法中有哪些重复计算这些重复计算就是DP可以优化的地方。从暴力到DP的优化过程往往能帮你找到状态设计的灵感。

相关新闻

把 pplx-decider 用于生产:意图路由、限流与安全鉴权实战清单(附代码)

把 pplx-decider 用于生产:意图路由、限流与安全鉴权实战清单(附代码)

【免费下载链接】pplx-decider-v1-27b 项目地址: https://ai.gitcode.com/hf_mirrors/perplexity-ai/pplx-decider-v1-27b 点击查看 免费下载 pplx-decider-v1-27b 是基于 Qwen3.8-27B 微调的决策模型(AutoJev),一次前向就能输出…

2026/10/16 13:41:21 阅读更多 →
DAB双有源桥单移相闭环控制Simulink仿真全流程详解

DAB双有源桥单移相闭环控制Simulink仿真全流程详解

双有源桥(DAB)这个拓扑,这几年做隔离型DCDC的人绕不开它。仿真里把DAB闭环跑通,说难不难,说简单也不简单——难点不在搭电路,而在把控制逻辑、参数整定和调制方式这些细节理顺。我最近把DAB单移相闭环控制在…

2026/10/16 13:41:20 阅读更多 →
人机共生工作流实战:从提示词工程到效率提升的完整方略

人机共生工作流实战:从提示词工程到效率提升的完整方略

1. 为什么“人机共生”不是口号,而是当下最现实的效率命题这两年我身边不少朋友都在焦虑同一件事:AI到底会不会把自己的饭碗抢走。做设计的担心出图工具一键生成海报,做文案的担心大模型三秒写出十版标题,做数据分析的担心自动建模…

2026/10/16 13:41:20 阅读更多 →

最新新闻

DeepSeek医疗本地化部署:医院内网AI训练全栈实践指南

DeepSeek医疗本地化部署:医院内网AI训练全栈实践指南

简介:本资源是一份面向医疗AI工程师与医院信息科技术人员的DeepSeek大模型本地化部署实战指南,聚焦医疗数据私有化训练场景,解决敏感病历数据合规处理、本地算力适配与垂直领域模型微调等核心问题。文档以PDF格式交付,共1个文件&a…

2026/10/16 14:17:21 阅读更多 →
论文AI率太高咋降才稳妥?2026年保姆级降AIGC流程:实用指令亲测揭秘+3款工具横评

论文AI率太高咋降才稳妥?2026年保姆级降AIGC流程:实用指令亲测揭秘+3款工具横评

花了整整三个月打磨的论文,送到学校AI检测系统一查,AI占比居然高达65%!实在百口莫辩,那些观点推导、文献引用,全是我翻遍几十份文献熬了无数夜攒出来的! 为了把居高不下的AI占比压到合格线内,我…

2026/10/16 14:17:21 阅读更多 →
盗梦空间结局新解:开放式叙事中的人物状态才是关键

盗梦空间结局新解:开放式叙事中的人物状态才是关键

1. 十年没吵完的结局:先把最核心的问题摆上台面《盗梦空间》的结尾到底意味着什么,这个问题从公映那天起就没停过争论。镜头里,主角柯布终于通关所有任务,回到家中,转动那只陀螺,然后抬头看见孩子的脸。镜头…

2026/10/16 14:17:21 阅读更多 →
免费降AI工具哪款好用?2026年亲测15款精选

免费降AI工具哪款好用?2026年亲测15款精选

为了筛选出适配不同场景的降AIGC率工具,我花了一整周时间,把市面上主流的付费、免费产品都逐一测试了一遍。 这份整理的内容全是我用废稿逐款测试得出的真实结果,没有夸大成分。不管你是想找免费的降AI率方案,还是想低成本稳妥完成…

2026/10/16 14:17:21 阅读更多 →
论文AI率过高不愁?2026年免费降AI指令搭配专业降AI工具拯救论文

论文AI率过高不愁?2026年免费降AI指令搭配专业降AI工具拯救论文

又到了每年毕业生的关键节点!最近后台收到大量私信,都是学弟学妹的反馈:“我熬夜写完的论文,学校测AIGC率居然到80%,真的是自己逐字写的啊!”或是“用AI辅助润色了下,查重直接飘红,不…

2026/10/16 14:17:21 阅读更多 →
TPC-DS基准测试:ClickHouse与Doris OLAP性能对比实战

TPC-DS基准测试:ClickHouse与Doris OLAP性能对比实战

做OLAP数据库选型,最怕的就是厂商自己掏出来的那份压测报告——查询速度一个比一个快,资源占用一个比一个省,真到自己业务上一跑,数据量一上去,才发现根本不是那么回事。所以我一直坚持拿统一的标准来测,TP…

2026/10/16 14:16:20 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →