状态压缩DP精解:从旅行商问题到P1523简化版实战
1. 项目概述从“旅行商”到“简化版”的思维跃迁一提到“旅行商问题”Traveling Salesman Problem, TSP很多刚接触算法竞赛的同学可能会心头一紧。这个经典的NP-Hard问题描述的是一个商人要拜访N个城市每个城市只去一次最后回到起点求最短路径。它的计算复杂度是O(N!)当N稍微大一点比如20计算量就大到天文数字直接暴力搜索根本行不通。这也就是为什么TSP在信奥赛题中常常以“简化版”或“变形题”的面貌出现——它考察的不是让你去解决一个真正的NP难题而是看你能否在理解问题本质后运用动态规划等算法思想在特定的约束条件下找到高效的解决方案。P1523这道题正是这样一个经典的“思维简化”案例。它没有要求我们解决标准的、无向完全图的TSP而是给出了一些特殊的限制条件比如“简化版”通常意味着点的分布有规律例如在一条直线上或二维平面上有特殊性质或者对路径有额外的约束。我们的任务就是用C这把利器将题目中描述的这个“简化版旅行商”模型通过清晰的逻辑分析和严谨的代码实现出来。这不仅是对你动态规划功底的检验更是对你问题转化和建模能力的一次实战演练。无论你是正在备战信奥的选手还是希望提升算法思维的C开发者吃透这道题都能让你对状态压缩DP有更深刻的理解。2. 核心思路解析为什么是动态规划与状态压缩面对“旅行商”类问题第一步永远是放弃暴力枚举的幻想。那么什么样的算法结构能高效处理这种“访问顺序”和“状态累积”的问题呢答案就是动态规划DP。但普通的线性DP或区间DP在这里显得力不从心因为我们需要记录“哪些点已经去过”这个集合信息。这就是状态压缩DPDP with Bitmask登场的时刻。状态压缩的核心思想是使用一个整数的二进制位来表示一个集合。例如我们有5个城市编号0-4那么一个整数mask21二进制10101就表示城市0、2、4已经被访问过了。通过这种方式我们可以将“状态”定义为一个二维甚至多维的DP数组例如dp[mask][i]其含义可以定义为“当前已经访问过的城市集合为mask并且最后停留在城市i时所花费的最小代价或最短路径”。对于P1523的简化版题目的具体条件会决定DP状态的具体定义和转移方程。常见的简化条件包括起点固定通常从城市0出发。访问所有点最终状态是mask的所有位都为1即(1n)-1。路径约束可能是单向的如只能从编号小的到大的或者点在数轴上只能左右移动。这里的“简化”往往就体现在这里它限制了状态转移的方向从而降低了复杂度。以最经典的一种“简化版”为例假设所有点都在一条数轴上旅行商从最左端的点出发需要访问所有点可以来回移动求总路程最小。这个问题可以转化为有两个旅行商同时从最左点出发分别向右走共同覆盖所有点。这等价于求两条覆盖所有点的路径其总长最小。此时我们可以定义dp[i][j]表示两个旅行商当前分别在第i和第j个点假设i j并且前j个点都已经被访问过时所走的最小总路程。状态转移时下一个点k j 1可以由i走到k也可以由j走到k取最小值。这就是著名的“双调欧几里得旅行商问题”的简化思路其复杂度是O(N²)相比O(N!)是巨大的飞跃。注意P1523的具体题意需要以官方题目描述为准。上述分析是基于“旅行商简化版”这一类题目的常见套路。你的核心任务是理解并实现“状态压缩DP”这个通用框架然后根据题目给出的具体输入输出格式和条件调整状态定义和转移方程。3. 算法框架搭建与关键实现细节无论题目条件如何细微变化基于状态压缩DP的解决方案都有一个相对固定的实现框架。我们以最常见的“从0号点出发访问所有点共n个求最后回到0号点的最短回路”为模型来构建代码骨架。你需要根据P1523的具体要求对此骨架进行修改。3.1 数据结构与状态定义首先我们需要存储任意两点间的距离。对于二维坐标点使用pairdouble, double或者两个数组x[], y[]来存储。#include bits/stdc.h using namespace std; const int MAXN 20; // 假设最大点数根据题目调整 const double INF 1e18; int n; double x[MAXN], y[MAXN]; double dist[MAXN][MAXN]; double dp[1 MAXN][MAXN]; // dp[mask][i]dp[mask][i]当前已访问点集合为mask二进制表示并且最后停留在点i时从起点走到此状态所经过的最小路径长度。这里i必须是mask集合中的点。3.2 状态初始化与转移方程初始化我们从起点通常是0号点开始。所以状态mask只有第0位为1且停留在0号点路径长为0。其他状态设为无穷大INF。// 计算两点间距离 for (int i 0; i n; i) { for (int j 0; j n; j) { dist[i][j] sqrt((x[i]-x[j])*(x[i]-x[j]) (y[i]-y[j])*(y[i]-y[j])); } } int total_states 1 n; for (int mask 0; mask total_states; mask) { for (int i 0; i n; i) { dp[mask][i] INF; } } dp[1][0] 0; // 从0号点出发集合中只有0当前在0距离为0。状态转移我们考虑如何从一个已知的状态dp[mask][i]扩展到新的状态。思想是枚举下一个还没去过的点j即mask的第j位为0从当前的i点走到j点。 转移方程dp[mask | (1 j)][j] min(dp[mask | (1 j)][j], dp[mask][i] dist[i][j]);for (int mask 1; mask total_states; mask) { // 遍历所有状态 for (int i 0; i n; i) { // 遍历当前可能停留的点i if (dp[mask][i] INF) continue; // 无效状态跳过 if (!(mask (1 i))) continue; // i必须在mask中这是一个保险检查 for (int j 0; j n; j) { // 枚举下一个点j if (mask (1 j)) continue; // j必须未被访问 int new_mask mask | (1 j); dp[new_mask][j] min(dp[new_mask][j], dp[mask][i] dist[i][j]); } } }3.3 获取最终答案最终我们需要访问所有点mask (1n) - 1并且最后回到起点0。所以答案需要在所有最终停留在某个点i的状态上加上从i回到起点0的距离。double ans INF; int full_mask (1 n) - 1; for (int i 0; i n; i) { if (dp[full_mask][i] INF) { ans min(ans, dp[full_mask][i] dist[i][0]); } } // 输出ans注意可能需要的格式如保留小数 printf(%.2f\n, ans);这就是状态压缩DP解决经典TSP的标准模板。对于P1523你需要仔细阅读题目起点和终点是否固定可能起点终点都是0也可能起点是0终点固定为另一个点。是否需要回到起点题目可能只要求访问所有点不要求回路。点的数量n的范围是多少这决定了MAXN的取值和算法是否可行通常n20左右。点的坐标是整数还是浮点数距离计算是否需要特殊处理实操心得在写状态转移时循环的顺序很重要。外层循环遍历mask可以保证在计算dp[mask][i]时所有“子状态”mask中少一个点的状态都已经被计算过了。这是一种常见的“按状态大小递增”的DP遍历方式。另外对于对称的TSP即dist[i][j] dist[j][i]我们可以添加一些优化比如总是让i是mask中编号最大的点可以减少一半的状态但代码会复杂一些。初学时先实现标准版本确保正确性更重要。4. 针对P1523的代码实现与调试由于我无法获取P1523的官方题目描述我将基于“简化版”的常见情形——所有点按x坐标排序后旅行商从最左点出发必须访问所有点可以向左或向右移动求总路径最小——来提供一个更贴近可能题意的实现。这个模型有时被称为“线性上的旅行商”。假设有n个点坐标已按x升序排序x[0] x[1] ... x[n-1]。我们从最左点0出发。定义dp[i][j]为两个旅行商或者理解为一个人的两条路径已经覆盖了从0到max(i, j)的所有点并且两人分别停在点i和点j假设i j时所走的总路程最小值。其中一个人停在j的刚刚访问了最新的点j。状态转移下一个要访问的点是k max(i, j) 1。如果让停在i的人去访问k那么新状态是dp[j][k]因为i变成了jj变成了k需要保证j k。如果让停在j的人去访问k那么新状态是dp[i][k]i不变j变成k需要保证i k。 转移方程dp[j][k] min(dp[j][k], dp[i][j] dist[i][k]);dp[i][k] min(dp[i][k], dp[i][j] dist[j][k]);初始化dp[0][0] 0。表示两人都在起点0覆盖了第0个点路程为0。最终答案访问完所有点后即i和j中有一个是n-1我们需要将两人“汇合”或结束。最终答案是min(dp[i][n-1] dist[i][n-1])其中i从0到n-2。因为最后一步可以是从任意一个点走到终点n-1。以下是基于这个思路的C代码实现#include bits/stdc.h using namespace std; const int MAXN 1005; // 根据题目可能的最大点数调整 const double INF 1e18; struct Point { double x, y; } p[MAXN]; double dist[MAXN][MAXN]; double dp[MAXN][MAXN]; // dp[i][j] 且约定 i j bool cmp(Point a, Point b) { return a.x b.x; } int main() { int n; scanf(%d, n); for (int i 0; i n; i) { scanf(%lf %lf, p[i].x, p[i].y); } // 按x坐标排序这是此简化模型的关键前提 sort(p, p n, cmp); // 预处理任意两点距离 for (int i 0; i n; i) { for (int j i; j n; j) { // 距离对称算一半即可 double dx p[i].x - p[j].x; double dy p[i].y - p[j].y; dist[i][j] dist[j][i] sqrt(dx * dx dy * dy); } } // DP数组初始化 for (int i 0; i n; i) { for (int j i; j n; j) { dp[i][j] INF; } } dp[0][0] 0.0; // 两人都在起点 // 状态转移 for (int i 0; i n; i) { for (int j i; j n; j) { if (dp[i][j] INF) continue; int k max(i, j) 1; if (k n) continue; // 所有点已访问完 // 从i走到k dp[j][k] min(dp[j][k], dp[i][j] dist[i][k]); // 从j走到k dp[i][k] min(dp[i][k], dp[i][j] dist[j][k]); } } // 计算答案最后一步从某个点i走到终点n-1 double ans INF; for (int i 0; i n-1; i) { ans min(ans, dp[i][n-1] dist[i][n-1]); } // 注意如果题目要求不需要回到某个特定点答案可能就是dp[i][n-1]的最小值 printf(%.2f\n, ans); return 0; }调试与验证要点输入格式首先确认题目输入是整数还是浮点数是先输入n再输入n行坐标还是其他格式。使用scanf或cin时类型要匹配。排序确认题目是否明确说明点已按x坐标排序或者是否需要我们自己排序。排序是此解法的核心前提务必确保。精度问题距离计算涉及开方输出时可能需要保留特定小数。使用double类型并用printf(“%.2f”)控制输出。边界条件当n1时程序是否能正确处理通常旅行商问题n2。可以添加特判。初始化dp[0][0]0是合理的但其他状态必须初始化为无穷大。最终答案仔细理解题目要求的输出是什么。是回到起点的回路总长还是从起点到终点的路径总长这里提供的代码计算的是“覆盖所有点后最后一步走到最右点n-1”的路径可能还需要加上从n-1回到起点的距离才是回路。请务必根据P1523的实际题目描述调整最终答案的计算逻辑。5. 常见错误与性能优化指南在实现和调试这类状态压缩DP问题时以下几个坑点非常常见1. 数组越界与内存溢出这是最致命的错误。状态压缩DP的数组大小是dp[1n][n]。如果n20那么120等于1,048,576。dp数组的大小约为1e6 * 20 * 8字节 ≈ 160MB这可能会超过一些在线评测系统的内存限制通常128MB或256MB。对策首先确认题目中n的最大范围。如果n接近20使用double类型且开二维数组可能很危险。可以考虑以下优化使用float代替double如果精度允许。使用滚动数组优化。因为状态转移时新状态mask总是比旧状态mask多一个1我们可以按mask中1的个数进行阶段划分只用两个二维数组滚动。如果n更大比如22上述方法可能都不行就需要思考题目是否有更特殊的性质可以利用或者是否存在其他多项式算法。2. 时间复杂度估算错误经典状态压缩DP TSP的时间复杂度是O(n² * 2ⁿ)。当n20时20*20*2^20 ≈ 4e8这个计算量在2秒的时间限制下非常紧张可能无法通过。对策剪枝在内层循环枚举j时可以只枚举mask中为0的位而不是遍历所有n个点。这需要用到__builtin_ctz等位运算技巧快速枚举0位可以显著减少常数。int not_visited (~mask) ((1 n) - 1); // 得到未访问点的集合 while (not_visited) { int j __builtin_ctz(not_visited); // 获取最低位的1的位置即一个未访问点 // ... 进行状态转移 not_visited not_visited - 1; // 清除最低位的1 }对称性优化对于无向图路径反过来距离一样。可以强制规定状态mask中编号最大的那个点是当前停留点i这样状态数可以减少近一半。使用更高效的算法如果题目是“线性简化版”那么O(n²)的DP如第4节所述是更优的选择。3. 浮点数精度问题计算几何题中距离、斜率比较都可能遇到精度问题。对策比较浮点数大小时不要直接用而是使用fabs(a-b) eps其中eps是一个很小的数如1e-9。在DP求最小值初始化时INF要足够大例如1e18。输出时严格按照题目要求保留小数位数。4. 状态定义与转移逻辑错误这是算法层面的核心错误。dp[mask][i]中的i必须属于mask集合。在状态转移时是从i走到一个不属于mask的j。对策在代码中加入断言Assert进行调试。assert(mask (1 i)); // 确保i在mask中 assert(!(mask (1 j))); // 确保j不在mask中清晰的注释和有意义的状态变量名也有助于避免逻辑混乱。5. 输入输出与格式错误对策仔细阅读题目输入输出说明。是多组数据还是单组输出是保留几位小数末尾是否有换行这些细节错误会导致“答案正确”但“提交错误”。建议使用统一的输入输出模板并养成最后输出换行符的习惯。对于P1523如果你使用第4节的线性DP解法复杂度是O(n²)通常可以轻松应对n1000的数据范围。关键在于正确理解题目并将其建模成“双旅行商”或“路径覆盖”问题。如果提交后Wrong Answer可以尝试以下排查顺序检查点是否按x坐标排序。检查最终答案的计算公式是否与题意相符是路径还是回路。用小的样例n2,3手动计算与程序输出对比。打印中间DP值观察状态转移是否符合预期。6. 从P1523延伸状态压缩DP的实战思维解完P1523你掌握的不仅仅是一道题的解法而是一套应对“集合状态优化”问题的强大工具——状态压缩DP。它的应用场景远不止旅行商问题。核心思维模式当你发现一个问题需要记录一个“是否做过/是否选择过”的集合并且这个集合的大小不超过20因为2^20 ≈ 1e6尚可接受就可以考虑状态压缩。用一个整数的二进制位表示这个集合dp[mask]或dp[mask][i]表示达到该集合状态时的最优值。其他经典应用场景图的哈密顿路径与TSP非常类似只是可能不要求回路或者对起点终点有要求。覆盖问题如“最短路径覆盖”、“最小支配集”的某些特例。棋盘放置问题在N×M的棋盘上放置棋子要求棋子之间不能相互攻击如炮兵阵地可以用mask表示前一行的放置状态。任务分配问题有n项任务和n个人每个人完成每项任务成本不同求最小总成本。这就是经典的指派问题可以用状态压缩DP在O(n*2ⁿ)解决。性能提升技巧预处理像TSP中预处理dist数组一样在其他问题中预处理出从某个状态mask进行某个操作所能得到的新状态或代价可以大幅减少转移时的计算量。按位枚举技巧如前所述使用lowbit操作x -x和__builtin_ctz来快速枚举二进制位比用for循环快很多。内存优化使用滚动数组或者利用状态的对称性减少维度。剪枝很多状态是无用的如果能在DP过程中提前判断并跳过可以节省大量时间。回到信奥备考刷题的目的不是记住每一道题的代码而是理解其背后的算法思想并能在新问题中识别出旧的模式。P1523“旅行商简化版”就是一个绝佳的跳板它让你亲身体验了如何将一个看似恐怖的NP问题通过巧妙的约束和状态定义转化为一个可解的DP问题。下次再遇到“需要记录访问过的点”、“求最短路径覆盖”这类描述时你大脑中“状态压缩”的警报就应该响起来了。这才是刷题训练的核心价值所在——构建你的算法直觉和问题解决工具箱。

相关新闻

COMSOL水力压裂模拟:流固耦合与损伤演化技术解析

COMSOL水力压裂模拟:流固耦合与损伤演化技术解析

1. COMSOL水力压裂模拟的技术背景与挑战 水力压裂技术作为非常规油气资源开发的核心手段,其数值模拟一直是石油工程领域的研究热点。传统的水力压裂模拟主要基于有限差分法或有限体积法,但这些方法在处理复杂地质条件下的裂缝扩展问题时存在明显局限。CO…

2026/8/4 13:48:02 阅读更多 →
告别臃肿模拟器:5分钟学会Windows直接运行安卓应用的终极指南

告别臃肿模拟器:5分钟学会Windows直接运行安卓应用的终极指南

告别臃肿模拟器:5分钟学会Windows直接运行安卓应用的终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为安卓模拟器卡顿、占用内存大而烦恼吗&a…

2026/8/4 13:48:02 阅读更多 →
多级缓存架构设计与SpringCloud Gateway集成实践

多级缓存架构设计与SpringCloud Gateway集成实践

1. 多级缓存体系架构设计背景现代分布式系统面临的核心挑战之一是如何在高并发场景下保持毫秒级响应。传统单一缓存方案往往难以兼顾性能与一致性需求,这正是我们需要构建多级缓存体系的根本原因。以电商平台的商品详情页为例,当某款热门手机开启预售时&…

2026/8/4 13:47:02 阅读更多 →

最新新闻

微信小程序美食推荐系统开发全攻略

微信小程序美食推荐系统开发全攻略

1. 项目概述 这个基于微信的美食推荐小程序是一个典型的计算机专业毕业设计项目,包含了完整的源码和LW文档。作为一款面向微信生态的轻量级应用,它充分利用了小程序即用即走的特性,为用户提供便捷的本地美食发现与推荐服务。 从技术架构来看…

2026/8/4 14:48:32 阅读更多 →
Python构建AI资讯聚合系统:爬虫与去重实战

Python构建AI资讯聚合系统:爬虫与去重实战

1. 项目背景与痛点分析 每天早上打开电脑,第一件事就是挨个点开二十多个AI技术网站查看更新——这曾是我持续半年的工作日常。作为AI领域的深度从业者,跟踪行业动态是刚需,但分散的信息源和重复的内容筛选消耗了大量时间。最崩溃的是&#xf…

2026/8/4 14:48:32 阅读更多 →
跨站脚本攻击(XSS)

跨站脚本攻击(XSS)

一、定义与核心原理 XSS(Cross-Site Scripting) 是一种常见的 Web 安全漏洞,攻击者通过在网页中注入恶意脚本(通常是 JavaScript),当其他用户访问该网页时,恶意脚本会在用户的浏览器中执行&…

2026/8/4 14:48:32 阅读更多 →
股票熔断机制是什么?股市的“紧急制动”!

股票熔断机制是什么?股市的“紧急制动”!

通俗来说,熔断机制就相当于股市的“紧急保护装置”。它的设计灵感,有点像汽车急刹时ABS防抱死系统的自动介入——不是为了防止刹车,而是为了防止车轮抱死导致车辆失控。 在股市语境下,这个“失控”就是恐慌性抛售。当市场跌幅达到…

2026/8/4 14:48:32 阅读更多 →
数据“新基建”破局:科技金融从“看报表”到“看创新”的范式革命

数据“新基建”破局:科技金融从“看报表”到“看创新”的范式革命

2026年7月29日,一则重磅消息在金融与科技两个领域同时引发震动。中国人民银行、国家发展改革委、科技部、工业和信息化部、海关总署、市场监管总局、金融监管总局、国家知识产权局、国家数据局——九部门罕见联合发文,印发《关于加强科技金融领域数据开发…

2026/8/4 14:48:32 阅读更多 →
Simulink同步发电机短路暂态建模与分析

Simulink同步发电机短路暂态建模与分析

1. 同步发电机短路暂态分析的技术背景 同步发电机作为电力系统的核心设备,其短路故障特性直接影响电网稳定性。当发生三相短路时,电枢反应会使转子励磁绕组产生衰减直流分量,导致气隙磁通发生剧烈变化。这种电磁暂态过程通常持续0.1-2秒&…

2026/8/4 14:47:32 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →