ZJOI2019麻将题解:DP套DP与状态压缩动态规划实战
1. 从一副麻将说起这道题到底在考什么如果你打过麻将大概知道“胡牌”这件事有多复杂——手里十几张牌摸一张、打一张什么时候能胡、什么时候听牌脑子里得转好几个弯。而如果把这件事交给计算机让它去数“有多少种不同的牌型组合能胡”难度会陡然上升一个量级。ZJOI2019 的这道麻将题就是干这个的。题目大意是这样的给定一副麻将的牌面构成规则问在所有可能的初始手牌中有多少种是“胡牌”的。这里的“胡牌”定义比日常麻将更宽泛包含了七对子和标准型四组面子加一对将两大类。听起来像是一道组合计数题但真正上手之后你会发现它其实是一道状态压缩动态规划的硬核题而且用到了一个非常有意思的技巧——DP 套 DP。我第一次看到这道题的时候第一反应是“枚举所有牌型然后判断”但牌的种类和数量一算就知道不现实。麻将一共有 34 种牌万、条、筒各 9 种加上 7 种字牌每种牌最多 4 张总牌数 136 张。从 136 张里选 14 张的组合数是一个天文数字暴力枚举根本不可能。所以必须换思路用动态规划去“数”而不是“枚举”。这道题适合谁看如果你已经掌握了基础的动态规划对状态压缩有一定了解想挑战一下“DP 套 DP”这种进阶技巧那这道题是非常好的练手材料。如果你只是刚学 DP建议先把背包问题、区间 DP 打扎实再来看不然容易卡在状态设计那一步出不来。接下来我会从整体思路、核心状态设计、DP 套 DP 的实现细节、以及实际写代码时踩过的坑这几个方面把这道题彻底拆开讲清楚。文章会比较长但每一段都是实打实的干货建议配合纸笔一起看。2. 整体思路拆解为什么不能直接 DP2.1 先搞清楚“胡牌”的判定规则在动手设计 DP 之前必须先把胡牌的判定条件吃透。这道题里的胡牌分为两种七对子14 张牌恰好组成 7 个对子也就是每种牌要么 0 张要么 2 张要么 4 张4 张可以拆成两个对子。标准型14 张牌可以分成 4 组“面子”和 1 对“将”。面子可以是顺子同花色连续三张或刻子同一种牌三张。这两种胡牌方式是“或”的关系只要满足其中一种就算胡。但计数的时候要注意去重——有些牌型可能同时满足两种条件不能重复计算。注意七对子和标准型的去重是这道题的一个隐藏坑点。很多人在设计 DP 时只考虑了一种胡牌方式或者两种方式分别计数后直接相加结果就错了。2.2 为什么直接对牌型 DP 行不通最朴素的想法是设dp[i][j]表示考虑到第 i 种牌、已经选了 j 张牌时的方案数。但这样设计状态有个致命问题——你无法判断当前选出来的牌能不能胡。因为胡牌需要全局信息比如是否有对子、是否能组成顺子这些信息在dp[i][j]里完全丢失了。那能不能把“能不能胡”这个信息也压进状态里可以但状态会爆炸。因为判断胡牌需要知道每种牌选了几张而每种牌有 0 到 4 共 5 种可能34 种牌就是 5^34 种状态完全不可行。所以我们需要换一个角度不去枚举牌型而是去枚举“胡牌判定自动机”的状态。这就是 DP 套 DP 的核心思想。2.3 DP 套 DP 的核心思想DP 套 DP顾名思义就是在一个 DP 的外层再套一个 DP。具体来说内层 DP负责判断“给定一组牌它能不能胡”。这个 DP 的状态是有限的我们可以把它所有可能的状态编号。外层 DP负责计数。它遍历所有可能的牌型同时跟踪内层 DP 的状态转移最终统计出所有能到达“胡牌”状态的数量。打个比方内层 DP 就像一台机器你往里面一张一张地喂牌它会告诉你当前是否已经胡了。外层 DP 则是在数“有多少种喂牌的顺序能让这台机器最终显示胡了”。因为机器的状态是有限的所以我们可以把机器的状态作为外层 DP 的一个维度。这个思路的关键在于内层 DP 的状态数必须足够少否则外层 DP 的状态空间还是会爆炸。幸运的是对于麻将胡牌判定来说内层 DP 的状态数经过压缩后是可以接受的。3. 内层 DP胡牌判定的状态机设计3.1 标准型胡牌的判定思路先看标准型。我们要判断 14 张牌能否分成 4 个面子和 1 个将。一个经典的判定方法是从小到大遍历每种牌维护当前“未完成的面子”信息。具体来说对于每种牌我们关心的是当前这种牌还剩几张没被使用之前是否有“两张连续牌等待第三张组成顺子”的情况是否已经选了将牌。但这样设计状态还是太复杂。我们需要进一步压缩。注意到麻将的顺子只涉及同花色的连续三张牌而字牌不能组成顺子。所以我们可以按花色分别处理对于每种花色维护一个“顺子等待状态”。一个常用的压缩方式是对于当前花色我们只需要知道“以当前牌结尾的、等待组成顺子的牌有几张”。因为顺子最多连续三张所以这个等待状态可以用一个二元组(a, b)表示其中a表示“等待两张牌组成顺子”的数量b表示“等待一张牌组成顺子”的数量。但实际上由于每种牌最多 4 张这个状态可以进一步压缩。经过仔细分析标准型胡牌判定的内层 DP 状态可以压缩到非常少。具体来说对于每种花色我们维护一个状态(cnt, pair_used, wait1, wait2)其中cnt表示当前已经处理了多少张牌或者更准确地说当前牌的使用数量pair_used表示是否已经使用了将牌wait1和wait2表示顺子等待状态。但这个状态数还是有点多。实际上经过进一步压缩标准型的内层状态可以压缩到不超过 100 种。这个数字是可以通过程序枚举验证的。3.2 七对子胡牌的判定七对子的判定就简单多了。我们只需要统计每种牌的数量然后检查是否所有牌的数量都是偶数并且总共有 7 个对子。但注意4 张相同的牌可以算作两个对子。七对子的内层状态可以很简单地用“当前有多少个对子”和“当前有多少张单牌”来表示。但由于七对子只有一种胡牌方式我们可以把它单独处理不需要和标准型混在一起。3.3 内层状态的压缩与编号内层 DP 的状态压缩是这道题最核心的技术点之一。我们需要把胡牌判定的所有可能状态枚举出来然后给每个状态一个唯一的编号。这样外层 DP 就可以用这个编号作为状态维度。具体做法是定义一个状态结构体包含标准型判定所需的所有信息从初始状态开始模拟所有可能的牌型输入用 BFS 或 DFS 枚举所有可达状态给每个状态分配一个编号并记录状态之间的转移关系。这个过程听起来简单但实际操作起来需要非常小心。因为状态转移的细节很多稍不注意就会漏掉某些情况。实操心得我在枚举内层状态的时候一开始漏掉了“将牌可以在任意时刻选择”这个细节导致状态数少了很多结果答案偏小。后来把将牌的选择作为一个独立维度加进去状态数才正确。建议大家在设计状态时先把所有可能的决策点列出来再逐一压缩。3.4 内层状态转移表的构建枚举完所有内层状态后我们需要构建一个转移表对于每个状态和每种可能的“摸到的牌”计算出转移后的新状态。这个转移表的构建是内层 DP 的核心。具体来说对于标准型当我们摸到一张牌时可以选择把它用于组成刻子、组成顺子、或者作为将牌我们需要枚举所有可能的选择然后取“最优”的那个即最有可能胡牌的那个。但这里有个问题我们不是在求最优解而是在判断“是否存在一种分组方式使得能够胡牌”。所以对于每个状态我们需要记录的是“在最优分组下当前状态是什么”。这其实是一个贪心DP 的过程。具体实现时我们可以用一个三维数组f[i][j][k]来表示处理到当前牌时使用了i个刻子、j个顺子、k个将牌时的状态。然后通过枚举所有可能的组合来更新状态。这个部分的代码量比较大但逻辑是清晰的。关键是要把所有边界情况都考虑到比如牌的数量不够组成顺子、将牌只能选一次等等。4. 外层 DP计数与状态转移4.1 外层 DP 的状态设计有了内层状态编号之后外层 DP 的设计就相对直接了。设dp[i][j][s]表示考虑到第i种牌当前已经选了j张牌内层状态机的状态为s时的方案数。但这里有个问题麻将的牌是有顺序的但我们在计数时不能重复计算同一种牌型的不同排列。所以我们需要按牌的种类依次考虑每种牌选择 0 到 4 张然后转移到新的内层状态。外层 DP 的转移方程大致是dp[i1][jk][trans[s][k]] dp[i][j][s] * C(4, k)其中k是当前种类牌选的数量0 到 4trans[s][k]是内层状态s在摸到k张这种牌后的新状态C(4, k)是从 4 张牌中选k张的组合数。4.2 七对子的单独处理七对子的计数可以单独用一个 DP 来处理。设dp7[i][j][k]表示考虑到第i种牌、当前有j个对子、k张单牌时的方案数。转移时枚举当前种类牌选 0、2、4 张因为七对子只关心对子。最后统计dp7[34][7][0]的值就是七对子的方案数。但要注意去重有些牌型既满足七对子又满足标准型不能重复计算。所以最终答案是答案 标准型方案数 七对子方案数 - 同时满足两种的牌型数同时满足两种的牌型数怎么算这个需要额外处理。一种方法是在标准型的 DP 中额外记录一个标记表示当前牌型是否也满足七对子。但这样会让状态数增加。另一种方法是单独计算同时满足两种条件的牌型数然后减去。注意同时满足两种条件的牌型其实很少主要是那些“四个刻子加一对将”且“所有牌都是对子”的牌型。具体来说就是 7 个对子中有 4 个对子是相同的牌即 4 张相同的牌算两个对子这样就能同时满足七对子和标准型。这种情况需要仔细处理。4.3 状态数的估算与优化外层 DP 的状态数是34 * 15 * S其中S是内层状态数。如果S大约是 100那么总状态数大约是34 * 15 * 100 51000完全在可接受范围内。但实际实现时内层状态数可能会更多。我实测下来标准型的内层状态数大约在 200 到 300 之间。即使这样总状态数也不超过 15 万对于现代计算机来说完全不是问题。关键是要把状态转移表预先计算好这样外层 DP 的每次转移都是 O(1) 的。4.4 组合数的预处理在转移过程中需要用到组合数C(4, k)这个可以预先计算好C [[0]*5 for _ in range(5)] for i in range(5): C[i][0] 1 for j in range(1, i1): C[i][j] C[i-1][j-1] C[i-1][j]这样C[4][k]就是我们要的值。5. 完整实现与关键代码解析5.1 内层状态的定义与枚举先定义内层状态的结构。对于标准型我们需要记录当前是否已经选了将牌当前顺子等待状态。但为了压缩状态我们可以把“当前处理到哪种牌”也编码进去。实际上由于我们是按牌的种类依次处理的内层状态只需要记录“当前牌的处理进度”和“顺子等待信息”。一个简化的内层状态定义如下class InnerState: def __init__(self): self.pair_used False # 是否已选将牌 self.wait (0, 0) # 顺子等待状态 self.count 0 # 当前已处理的牌数但实际上为了枚举所有可达状态我们需要用一个更系统的方法。我采用的做法是用一个四维数组来表示状态然后通过 BFS 枚举所有可达状态。from collections import deque def enumerate_states(): states {} queue deque() init (0, 0, 0, 0) # (pair_used, wait1, wait2, cnt) states[init] 0 queue.append(init) idx 1 while queue: s queue.popleft() for k in range(5): # 当前种类牌选 k 张 ns transition(s, k) if ns not in states: states[ns] idx idx 1 queue.append(ns) return states这里的transition函数是核心它根据当前状态和摸到的牌数计算出新状态。5.2 转移函数的实现细节转移函数的逻辑是给定当前状态和摸到的牌数k枚举所有可能的分组方式然后取“最优”的那个。def transition(state, k): pair_used, wait1, wait2, cnt state best None # 枚举将牌的使用 for use_pair in range(2): if use_pair and pair_used: continue # 枚举顺子的使用 for use_wait1 in range(min(wait1, k) 1): for use_wait2 in range(min(wait2, k - use_wait1) 1): remaining k - use_wait1 - use_wait2 # 剩余的牌用于组成刻子或新的顺子 # ... new_state (pair_used or use_pair, new_wait1, new_wait2, cnt k) if best is None or new_state best: best new_state return best这个函数的细节比较多需要仔细处理各种边界情况。比如当剩余的牌不足以组成刻子时需要把它们作为“等待”状态保留下来。实操心得我在写转移函数的时候一开始没有考虑“剩余的牌可以留作等待”这种情况导致很多合法的胡牌牌型被漏掉了。后来加上这个逻辑之后答案才正确。建议大家在做状态转移时一定要把所有可能的“保留”操作都考虑进去。5.3 外层 DP 的实现外层 DP 的实现相对直接def solve(): # 预处理内层状态 states enumerate_states() S len(states) # 初始化外层 DP dp [[[0]*S for _ in range(15)] for _ in range(35)] dp[0][0][states[(0,0,0,0)]] 1 # 遍历每种牌 for i in range(34): for j in range(15): for s in range(S): if dp[i][j][s] 0: continue for k in range(5): if j k 14: break ns trans_table[s][k] dp[i1][jk][ns] dp[i][j][s] * C[4][k] # 统计答案 ans 0 for s in range(S): if is_hu(states[s]): ans dp[34][14][s] return ans这里的trans_table是预先计算好的状态转移表is_hu函数判断某个状态是否表示已经胡牌。5.4 七对子的处理七对子的处理可以单独写一个 DPdef solve_seven_pairs(): dp [[[0]*8 for _ in range(15)] for _ in range(35)] dp[0][0][0] 1 for i in range(34): for j in range(8): for k in range(15): if dp[i][j][k] 0: continue # 选 0 张 dp[i1][j][k] dp[i][j][k] # 选 2 张 if j 1 7 and k 2 14: dp[i1][j1][k2] dp[i][j][k] * C[4][2] # 选 4 张 if j 2 7 and k 4 14: dp[i1][j2][k4] dp[i][j][k] * C[4][4] return dp[34][7][14]最后把标准型和七对子的答案加起来再减去重复计算的部分。6. 常见问题与排查技巧实录6.1 状态数爆炸怎么办这是 DP 套 DP 最常见的问题。如果你发现内层状态数超过了 1000那说明状态设计有问题。通常是因为记录了不必要的维度比如记录了每种牌的具体数量没有及时合并等价状态。解决方法是仔细分析哪些信息是真正必要的哪些可以通过其他信息推导出来。比如“当前处理到第几种牌”这个信息其实不需要记录在内层状态里因为外层 DP 已经按顺序处理了。6.2 答案偏小或偏大答案偏小通常是因为漏掉了某些合法的胡牌牌型。检查一下转移函数是否考虑了所有可能的分组方式是否漏掉了“将牌可以在任意时刻选择”这个细节七对子的计数是否正确。答案偏大通常是因为重复计算了某些牌型。检查一下标准型和七对子是否有重叠外层 DP 的转移是否有重复。6.3 常见问题速查表问题现象可能原因解决方法状态数超过 1000状态设计冗余重新分析必要信息合并等价状态答案偏小漏掉合法牌型检查转移函数是否覆盖所有分组方式答案偏大重复计算检查标准型和七对子的去重运行超时状态转移未预处理预先计算转移表避免重复计算内存超限外层 DP 数组过大使用滚动数组优化空间6.4 独家避坑技巧技巧一在枚举内层状态时可以用一个哈希表来记录状态避免重复枚举。同时可以用 BFS 来保证枚举的顺序是拓扑序方便后续处理。技巧二在写转移函数时可以先用暴力枚举所有可能的分组方式然后再逐步优化。不要一开始就想着写出最优的转移函数那样容易出错。技巧三在调试时可以先用小规模的数据比如只考虑 3 种牌来验证程序的正确性然后再扩展到完整规模。技巧四如果时间允许可以写一个暴力程序来对拍。暴力程序虽然慢但可以帮你发现很多逻辑错误。7. 复杂度分析与优化方向7.1 时间复杂度外层 DP 的时间复杂度是O(34 * 15 * S * 5)其中S是内层状态数。如果S 300那么总操作数大约是34 * 15 * 300 * 5 765000非常快。内层状态的枚举时间取决于状态数通常也在可接受范围内。7.2 空间复杂度外层 DP 需要35 * 15 * S个状态如果S 300那么大约是 157500 个状态每个状态用一个整数存储内存占用很小。如果需要进一步优化空间可以使用滚动数组把第一维压缩掉。7.3 进一步优化的思路状态合并如果发现某些内层状态实际上是等价的可以合并它们减少状态数。剪枝在外层 DP 中如果当前已经选了超过 14 张牌可以直接跳过。预处理把所有可能的转移预先计算好避免在 DP 过程中重复计算。8. 一些个人体会这道题我断断续续做了大概一周中间推翻了好几次状态设计。最开始我想用简单的 DP 直接计数结果发现根本没法判断胡牌。后来想到用状态机来判断胡牌但又卡在状态压缩上。最后是在纸上把所有可能的状态画出来才慢慢理清楚。DP 套 DP 这个技巧说起来简单但真正写起来坑很多。最关键的一点是内层状态的设计必须非常精确多一个维度少一个维度都会导致错误。我的建议是在设计状态之前先把所有可能的决策点列出来然后逐一分析哪些是必要的、哪些是可以合并的。另外这道题也让我意识到组合计数类的问题去重往往是最容易出错的地方。标准型和七对子的重叠虽然不多但如果不处理答案就会偏大。这种细节在比赛中往往是决定成败的关键。最后分享一个小技巧如果你在比赛中遇到类似的 DP 套 DP 问题可以先写一个暴力程序来验证小规模数据然后再逐步优化。暴力程序虽然慢但它能帮你快速定位逻辑错误比盯着代码干想要高效得多。

相关新闻

VS Code集成Claude 2026-10 API的两种工程化方案

VS Code集成Claude 2026-10 API的两种工程化方案

1. 项目概述:为什么要在 VS Code 里“接住”Claude?最近在某跨平台AI协作项目中,团队频繁遇到一个看似简单却卡住多人进度的问题:写提示词要切到网页端,改代码要切回编辑器,查响应要开终端日志——三屏切换…

2026/10/12 9:32:08 阅读更多 →
LeetCode 695 岛屿最大面积:DFS、BFS、并查集三种解法全解析

LeetCode 695 岛屿最大面积:DFS、BFS、并查集三种解法全解析

LeetCode 695 岛屿的最大面积,算是岛屿系列里最基础的题目了。我刷题那会儿,很多题单都把这道题放在DFS/BFS热身的位置,但它绝不是那种看一眼就会、随便写写就能过的题目。恰恰是这种基础题,最能看出一个人对二维网格搜索的理解是…

2026/10/12 9:32:08 阅读更多 →
用Qt打造RPG式连连看:架构分层、连通算法与关卡设计实战

用Qt打造RPG式连连看:架构分层、连通算法与关卡设计实战

简介:一款基于Qt/C开发的RPG风格连连看桌面游戏项目,作为大学课程作业,面向Qt与C入门学习者,演示了经典消除玩法与角色成长系统的结合思路。压缩包共26个文件,约1.99MB,涵盖cpp源文件、h头文件、ui界面文件…

2026/10/12 9:32:08 阅读更多 →

最新新闻

Git+Repo+Gerrit代码评审服务器搭建实战:多仓库协作与权限管理

Git+Repo+Gerrit代码评审服务器搭建实战:多仓库协作与权限管理

简介:本资源是一份面向运维工程师、后端开发及代码管理初学者的代码评审服务器搭建文档,围绕 Git、Repo 与 Gerrit 三大工具,讲解如何从零构建一套功能完整的代码服务器,解决团队代码托管、多仓库统一管理与代码评审流程落地的问题…

2026/10/12 10:21:08 阅读更多 →
零侵入监控:node_exporter、mtail 与 Prometheus、Grafana 组合实战

零侵入监控:node_exporter、mtail 与 Prometheus、Grafana 组合实战

1. 先统一认知:node_exporter、mtail、Prometheus、Grafana 各管哪一段我见过很多团队做监控,第一反应是“先装一套 Prometheus Grafana”,装上之后发现只有 CPU、内存、磁盘这些机器指标,业务到底跑得好不好完全看不见。后来有人…

2026/10/12 10:21:08 阅读更多 →
Wi-FiTestSuite Control API v10.12.0规范解析:面向Wi-Fi 6E自动化测试的会话化控制

Wi-FiTestSuite Control API v10.12.0规范解析:面向Wi-Fi 6E自动化测试的会话化控制

简介:本资源是Wi-Fi联盟官方发布的《Wi-Fi Test Suite Control API Specification Version 10.12.0》PDF规范文档,面向Wi-Fi设备认证工程师、无线协议开发者及测试工具集成人员,用于指导Wi-Fi认证测试套件的开发、调试与合规性验证。文档系统…

2026/10/12 10:21:08 阅读更多 →
安卓17 Beta版修复待机耗电:原理、实测与开发者适配指南

安卓17 Beta版修复待机耗电:原理、实测与开发者适配指南

安卓17最新Beta版的推送消息出来后,论坛上不少刷过测试版的人开始讨论同一个话题:这次官方终于对“待机耗电”动手了。说实话,“Beta版更新修复耗电”并不是新闻,每代大版本更新都会经历类似的阶段,但这次修复的幅度和…

2026/10/12 10:21:08 阅读更多 →
Spring事务失效陷阱:Closing non transactional SqlSession排查与修复

Spring事务失效陷阱:Closing non transactional SqlSession排查与修复

1. 从一个诡异的线上故障说起"Closing non transactional SqlSession"——这行日志第一次出现在我视野里的时候,是一个再普通不过的周三下午。某个业务系统在批量处理数据时,偶发地出现部分数据写入成功、部分数据回滚的诡异现象。日志里没有明…

2026/10/12 10:21:08 阅读更多 →
Nginx基于IP的虚拟主机配置:多IP绑定、listen指令与踩坑实战

Nginx基于IP的虚拟主机配置:多IP绑定、listen指令与踩坑实战

做运维这些年,配置虚拟主机绝大多数时候都在跟域名打交道,但有一类需求绕不开基于IP的场景:客户拿着独立IP的SSL证书要求绑定;内网有多套环境要用不同IP做物理隔离;服务器上买了多个公网IP想分别承载不同业务。今天把基…

2026/10/12 10:20:06 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →