<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>FishMoun</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://fishmoun.github.io/</id>
  <link href="https://fishmoun.github.io/" rel="alternate"/>
  <link href="https://fishmoun.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, FishMoun</rights>
  <subtitle>记录技术、学习和生活</subtitle>
  <title>我的个人博客</title>
  <updated>2026-05-06T15:33:03.180Z</updated>
  <entry>
    <author>
      <name>FishMoun</name>
    </author>
    <category term="个人日志" scheme="https://fishmoun.github.io/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E5%BF%97/"/>
    <content>
      <![CDATA[<h2 id="时长"><a href="#时长" class="headerlink" title="时长"></a>时长</h2><p>今日开始专注时间：下午3点</p><p>今日结束专注时间：凌晨5点20</p><p>专注总时长：10h 20h</p><h2 id="实际完成"><a href="#实际完成" class="headerlink" title="实际完成"></a>实际完成</h2><p>1、完成论文camera-ready版本</p><p>2、部署hermes智能体</p><h2 id="未完成目标"><a href="#未完成目标" class="headerlink" title="未完成目标"></a>未完成目标</h2><p>五道算法题</p><h2 id="收获"><a href="#收获" class="headerlink" title="收获"></a>收获</h2><p>1、熟悉hermes的部署流程， 了解hermes的基本架构</p><p>2、验证：实践大于记忆与练习</p><h2 id="明日目标"><a href="#明日目标" class="headerlink" title="明日目标"></a>明日目标</h2><p>5道手撕算法 2h （文档产出）</p><p>华为5道算法 3h （文档产出）</p><p>手撕并行缓存+内存淘汰策略  2h（文档产出）</p><p>阿里3面深度复盘 1h （文档产出）</p><p>java基础65条背诵  2h+（文档产出）</p><p>灵旅项目重构 2h （文档产出）</p>]]>
    </content>
    <id>https://fishmoun.github.io/2026/05/06/2026%205%201%E5%A4%8D%E7%9B%98/</id>
    <link href="https://fishmoun.github.io/2026/05/06/2026%205%201%E5%A4%8D%E7%9B%98/"/>
    <published>2026-05-06T15:33:03.180Z</published>
    <summary>
      <![CDATA[<h2 id="时长"><a href="#时长" class="headerlink" title="时长"></a>时长</h2><p>今日开始专注时间：下午3点</p>
<p>今日结束专注时间：凌晨5点20</p>
<p>专注总时长：10h 20h</p>
<h2 id="]]>
    </summary>
    <title>2026 5 1复盘</title>
    <updated>2026-05-06T15:33:03.180Z</updated>
  </entry>
  <entry>
    <author>
      <name>FishMoun</name>
    </author>
    <category term="个人日志" scheme="https://fishmoun.github.io/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E5%BF%97/"/>
    <content>
      <![CDATA[<h2 id="时长"><a href="#时长" class="headerlink" title="时长"></a>时长</h2><p>今日开始专注时间：下午14点45</p><p>今日结束专注时间：凌晨1点13</p><p>专注总时长：6h 30h(高强度思考)</p><h2 id="实际完成"><a href="#实际完成" class="headerlink" title="实际完成"></a>实际完成</h2><p>1、华为八道算法题</p><h2 id="未完成目标"><a href="#未完成目标" class="headerlink" title="未完成目标"></a>未完成目标</h2><p>2道未完成的算法 1h</p><p>华为手撕题5道 1h</p><p>手撕并行缓存+淘汰策略 30min</p><p>灵旅项目重构 2h</p><h2 id="收获"><a href="#收获" class="headerlink" title="收获"></a>收获</h2><p>1、加深了对动态规划的印象</p><p>2、对目标规划和自己的能力有了更加清晰的认知</p><h2 id="明日目标"><a href="#明日目标" class="headerlink" title="明日目标"></a>明日目标</h2><p>明天上工第一件事，思考10分钟的第十题的算法过程</p><p>完成五道算法之后，进行两个小时的灵旅项目重构，并评估后续重构时间</p><p>然后再完成剩余五道算法题</p>]]>
    </content>
    <id>https://fishmoun.github.io/2026/05/06/2026%205%203%E5%A4%8D%E7%9B%98/</id>
    <link href="https://fishmoun.github.io/2026/05/06/2026%205%203%E5%A4%8D%E7%9B%98/"/>
    <published>2026-05-06T15:33:03.180Z</published>
    <summary>
      <![CDATA[<h2 id="时长"><a href="#时长" class="headerlink" title="时长"></a>时长</h2><p>今日开始专注时间：下午14点45</p>
<p>今日结束专注时间：凌晨1点13</p>
<p>专注总时长：6h 30h(高强度思考)</p>]]>
    </summary>
    <title>2026 5 3复盘</title>
    <updated>2026-05-06T15:33:03.180Z</updated>
  </entry>
  <entry>
    <author>
      <name>FishMoun</name>
    </author>
    <category term="个人日志" scheme="https://fishmoun.github.io/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E5%BF%97/"/>
    <content>
      <![CDATA[<h2 id="时长"><a href="#时长" class="headerlink" title="时长"></a>时长</h2><p>今日开始专注时间：下午14点51</p><p>今日结束专注时间：凌晨1点57</p><p>专注总时长：7h52</p><h2 id="实际完成"><a href="#实际完成" class="headerlink" title="实际完成"></a>实际完成</h2><p>1、华为五道算法题（题目较难）</p><p>2、灵旅项目重构 2h</p><p>3、个人待办事项多端同步</p><p>4、完成行为习惯目标：白天不打游戏</p><h2 id="未完成目标"><a href="#未完成目标" class="headerlink" title="未完成目标"></a>未完成目标</h2><p>剩余五道算法题</p><h2 id="收获"><a href="#收获" class="headerlink" title="收获"></a>收获</h2><p>在算法题上还是花费了较多时间，而且由于题目较难，算法本身还需要复习巩固</p><p>因此后续在做算法题的时候，要严格控制自己写的时间：思考最多10min+ 写最多15min + 复盘15min  每题的时间控制在40min左右</p><h2 id="明日目标"><a href="#明日目标" class="headerlink" title="明日目标"></a>明日目标</h2><p>明天上工第一件事：</p><p>1、重启本地工作站（带鼠标）</p><p>1）完成迁移重点项目文件</p><p>2、RAG八股记忆</p><p>3、并行缓存手撕</p><p>4、完成灵旅项目重构完成</p><p>5、五道算法题</p>]]>
    </content>
    <id>https://fishmoun.github.io/2026/05/06/2026%205%204%E5%A4%8D%E7%9B%98/</id>
    <link href="https://fishmoun.github.io/2026/05/06/2026%205%204%E5%A4%8D%E7%9B%98/"/>
    <published>2026-05-06T15:33:03.180Z</published>
    <summary>
      <![CDATA[<h2 id="时长"><a href="#时长" class="headerlink" title="时长"></a>时长</h2><p>今日开始专注时间：下午14点51</p>
<p>今日结束专注时间：凌晨1点57</p>
<p>专注总时长：7h52</p>
<h2 id="]]>
    </summary>
    <title>2026 5 4复盘</title>
    <updated>2026-05-06T15:33:03.180Z</updated>
  </entry>
  <entry>
    <author>
      <name>FishMoun</name>
    </author>
    <category term="个人日志" scheme="https://fishmoun.github.io/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E5%BF%97/"/>
    <content>
      <![CDATA[<h2 id="时长"><a href="#时长" class="headerlink" title="时长"></a>时长</h2><p>今日开始专注时间：下午4点</p><p>今日结束专注时间：凌晨0点15</p><p>专注总时长：6h 50h</p><h2 id="实际完成"><a href="#实际完成" class="headerlink" title="实际完成"></a>实际完成</h2><p>1、阿里面试复盘</p><p>2、初步熟悉并部署openClaw智能体</p><h2 id="未完成目标"><a href="#未完成目标" class="headerlink" title="未完成目标"></a>未完成目标</h2><p>5道手撕算法 2h （文档产出）</p><p>华为5道算法 3h （文档产出）</p><p>手撕并行缓存+内存淘汰策略  2h（文档产出）</p><p>java基础65条背诵  2h+（文档产出）</p><p>灵旅项目重构 2h （文档产出）</p><h2 id="收获"><a href="#收获" class="headerlink" title="收获"></a>收获</h2><p>1、熟悉openclaw的部署流程， 了解openclaw的基本架构，用法</p><h2 id="明日目标"><a href="#明日目标" class="headerlink" title="明日目标"></a>明日目标</h2><p>目标1：明天到工位的第一件事：</p><p>1、写华为的一道算法题（想15分钟，想不出来就看答案，复写）</p><p>目标2：明天只完成在目标范围内的任务</p><p>目标3：明天在工作时间不能玩</p><p>1）华为的10道算法题 5h</p><p>2）华为手撕题5道 2h</p><p>3）面试行动1：手撕并行缓存+淘汰策略 1h</p><p>4）灵旅项目重构 2h</p><p>10点钟到工位</p><p>10: 00 - 12: 30 华为算法题</p><p>14: 00 - 16: 30 华为算法题</p><p>17: 00 - 19: 00 华为手撕题5道</p><p>20: 00 - 21: 00 手撕并行缓存+淘汰策略</p><p>21: 00 - 23: 00 灵旅项目重构 2h</p>]]>
    </content>
    <id>https://fishmoun.github.io/2026/05/06/2026%205%202%E5%A4%8D%E7%9B%98/</id>
    <link href="https://fishmoun.github.io/2026/05/06/2026%205%202%E5%A4%8D%E7%9B%98/"/>
    <published>2026-05-06T15:33:03.180Z</published>
    <summary>
      <![CDATA[<h2 id="时长"><a href="#时长" class="headerlink" title="时长"></a>时长</h2><p>今日开始专注时间：下午4点</p>
<p>今日结束专注时间：凌晨0点15</p>
<p>专注总时长：6h 50h</p>
<h2 id="实]]>
    </summary>
    <title>2026 5 2复盘</title>
    <updated>2026-05-06T15:33:03.180Z</updated>
  </entry>
  <entry>
    <author>
      <name>FishMoun</name>
    </author>
    <category term="知识点记忆" scheme="https://fishmoun.github.io/categories/%E7%9F%A5%E8%AF%86%E7%82%B9%E8%AE%B0%E5%BF%86/"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>本文章是对RAG的系统学习的相关笔记</p><p><strong>RAG</strong></p><p>检索增强生成</p><p><strong>架构</strong></p><p>1）离线知识构建</p><p>解析 清洗 切分 元数据标注 向量化 写入向量数据库</p><p>2）在线问答推理</p><p>问题理解 召回 重排 拼接 生成 </p><p><strong>RRF融合</strong></p><p>只看排名，不用对齐不同检索器的分数</p><p><strong>HyDE：假设性文档检索</strong></p><p>大模型对问题假想答案，用答案去丰富检索文本</p><p><strong>Slot Extraction：槽位抽取</strong></p><p>把用户提示词抽取为JSON形式，直接用于metadata过滤和检索</p><p><strong>Rag的评价指标</strong></p><p>1、检索评价</p><p>Recall@K</p><p>Precision@K</p><p>MMR</p><p>nDCR</p><p>2、生成评价</p><h3 id="面试问题汇总"><a href="#面试问题汇总" class="headerlink" title="面试问题汇总"></a>面试问题汇总</h3><h4 id="问题-1：RAG-的核心流程是什么？"><a href="#问题-1：RAG-的核心流程是什么？" class="headerlink" title="问题 1：RAG 的核心流程是什么？"></a>问题 1：RAG 的核心流程是什么？</h4><p>可以回答：</p><blockquote><p>RAG 分为离线知识构建和在线问答两部分。离线阶段会对文档进行解析、清洗、切分、元数据标注、embedding 向量化，并写入向量数据库。在线阶段会对用户问题进行改写或结构化处理，然后通过向量检索、关键词检索、metadata 过滤等方式召回相关 chunk，再经过 rerank 精排，最后把高相关上下文拼接进 prompt，让大模型基于检索内容生成答案。</p></blockquote><hr><h4 id="问题-2：为什么不能只用向量检索？"><a href="#问题-2：为什么不能只用向量检索？" class="headerlink" title="问题 2：为什么不能只用向量检索？"></a>问题 2：为什么不能只用向量检索？</h4><p>可以回答：</p><blockquote><p>纯向量检索适合语义相似问题，但对数字、专有名词、代码、订单号、地点精确匹配等场景不一定稳定。比如用户问具体订单号、政策编号或景点名称时，关键词检索和 metadata 过滤反而更可靠。所以实际系统中通常会使用混合检索，把向量检索的语义召回能力和 BM25&#x2F;关键词检索的精确匹配能力结合起来。</p></blockquote><hr><h4 id="问题-3：chunk-太大或太小有什么问题？"><a href="#问题-3：chunk-太大或太小有什么问题？" class="headerlink" title="问题 3：chunk 太大或太小有什么问题？"></a>问题 3：chunk 太大或太小有什么问题？</h4><p>可以回答：</p><blockquote><p>chunk 太大会导致一个片段里包含太多无关信息，检索虽然命中，但放进 prompt 后会干扰模型；chunk 太小会破坏语义完整性，比如只召回一句话却缺少标题、上下文或限定条件。实际需要结合文档结构进行切分，比如按标题、段落、语义边界切分，并设置适当 overlap 来保留上下文。</p></blockquote><hr><h4 id="问题-4：Rerank-的作用是什么？"><a href="#问题-4：Rerank-的作用是什么？" class="headerlink" title="问题 4：Rerank 的作用是什么？"></a>问题 4：Rerank 的作用是什么？</h4><p>可以回答：</p><blockquote><p>初始检索更像粗召回，目标是尽量不要漏掉相关文档，但排序不一定准确。Rerank 是精排阶段，它会结合用户问题和候选 chunk 重新计算相关性，把真正能回答问题的内容排到前面。这样可以提升 topK 结果质量，减少无关上下文进入 prompt。</p></blockquote><hr><h4 id="问题-5：RAG-如何降低幻觉？"><a href="#问题-5：RAG-如何降低幻觉？" class="headerlink" title="问题 5：RAG 如何降低幻觉？"></a>问题 5：RAG 如何降低幻觉？</h4><p>可以回答：</p><blockquote><p>RAG 通过引入外部知识上下文，让模型基于检索资料回答，可以降低凭空编造的概率。但 RAG 不能完全消除幻觉，还需要 prompt 约束、引用来源、检索为空时拒答、答案一致性检查等机制。比如可以要求模型只根据提供资料回答，如果资料不足就明确说明无法确定。</p></blockquote><hr><h4 id="问题-6：如何评估-RAG-效果？"><a href="#问题-6：如何评估-RAG-效果？" class="headerlink" title="问题 6：如何评估 RAG 效果？"></a>问题 6：如何评估 RAG 效果？</h4><p>可以回答：</p><blockquote><p>可以分为检索效果和生成效果两层。检索层看 Recall@K、Precision@K、MRR、nDCG，判断正确文档是否被召回、是否排在前面。生成层看答案正确性、完整性、是否基于上下文、是否存在幻觉、引用是否准确。工程上可以构造一批标准问答集，持续评估不同 chunk 策略、embedding 模型、topK、rerank 策略对效果的影响。</p></blockquote><hr><h4 id="问题-7：RAG-和微调怎么选？问题-1：RAG-的核心流程是什么？"><a href="#问题-7：RAG-和微调怎么选？问题-1：RAG-的核心流程是什么？" class="headerlink" title="问题 7：RAG 和微调怎么选？问题 1：RAG 的核心流程是什么？"></a>问题 7：RAG 和微调怎么选？问题 1：RAG 的核心流程是什么？</h4><p>可以回答：</p><blockquote><p>RAG 分为离线知识构建和在线问答两部分。离线阶段会对文档进行解析、清洗、切分、元数据标注、embedding 向量化，并写入向量数据库。在线阶段会对用户问题进行改写或结构化处理，然后通过向量检索、关键词检索、metadata 过滤等方式召回相关 chunk，再经过 rerank 精排，最后把高相关上下文拼接进 prompt，让大模型基于检索内容生成答案。</p></blockquote><hr><h2 id="问题-2：为什么不能只用向量检索？-1"><a href="#问题-2：为什么不能只用向量检索？-1" class="headerlink" title="问题 2：为什么不能只用向量检索？"></a>问题 2：为什么不能只用向量检索？</h2><p>可以回答：</p><blockquote><p>纯向量检索适合语义相似问题，但对数字、专有名词、代码、订单号、地点精确匹配等场景不一定稳定。比如用户问具体订单号、政策编号或景点名称时，关键词检索和 metadata 过滤反而更可靠。所以实际系统中通常会使用混合检索，把向量检索的语义召回能力和 BM25&#x2F;关键词检索的精确匹配能力结合起来。</p></blockquote><hr><h2 id="问题-3：chunk-太大或太小有什么问题？-1"><a href="#问题-3：chunk-太大或太小有什么问题？-1" class="headerlink" title="问题 3：chunk 太大或太小有什么问题？"></a>问题 3：chunk 太大或太小有什么问题？</h2><p>可以回答：</p><blockquote><p>chunk 太大会导致一个片段里包含太多无关信息，检索虽然命中，但放进 prompt 后会干扰模型；chunk 太小会破坏语义完整性，比如只召回一句话却缺少标题、上下文或限定条件。实际需要结合文档结构进行切分，比如按标题、段落、语义边界切分，并设置适当 overlap 来保留上下文。</p></blockquote><hr><h2 id="问题-4：Rerank-的作用是什么？-1"><a href="#问题-4：Rerank-的作用是什么？-1" class="headerlink" title="问题 4：Rerank 的作用是什么？"></a>问题 4：Rerank 的作用是什么？</h2><p>可以回答：</p><blockquote><p>初始检索更像粗召回，目标是尽量不要漏掉相关文档，但排序不一定准确。Rerank 是精排阶段，它会结合用户问题和候选 chunk 重新计算相关性，把真正能回答问题的内容排到前面。这样可以提升 topK 结果质量，减少无关上下文进入 prompt。</p></blockquote><hr><h2 id="问题-5：RAG-如何降低幻觉？-1"><a href="#问题-5：RAG-如何降低幻觉？-1" class="headerlink" title="问题 5：RAG 如何降低幻觉？"></a>问题 5：RAG 如何降低幻觉？</h2><p>可以回答：</p><blockquote><p>RAG 通过引入外部知识上下文，让模型基于检索资料回答，可以降低凭空编造的概率。但 RAG 不能完全消除幻觉，还需要 prompt 约束、引用来源、检索为空时拒答、答案一致性检查等机制。比如可以要求模型只根据提供资料回答，如果资料不足就明确说明无法确定。</p></blockquote><hr><h2 id="问题-6：如何评估-RAG-效果？-1"><a href="#问题-6：如何评估-RAG-效果？-1" class="headerlink" title="问题 6：如何评估 RAG 效果？"></a>问题 6：如何评估 RAG 效果？</h2><p>可以回答：</p><blockquote><p>可以分为检索效果和生成效果两层。检索层看 Recall@K、Precision@K、MRR、nDCG，判断正确文档是否被召回、是否排在前面。生成层看答案正确性、完整性、是否基于上下文、是否存在幻觉、引用是否准确。工程上可以构造一批标准问答集，持续评估不同 chunk 策略、embedding 模型、topK、rerank 策略对效果的影响。</p></blockquote><hr><h2 id="问题-7：RAG-和微调怎么选？"><a href="#问题-7：RAG-和微调怎么选？" class="headerlink" title="问题 7：RAG 和微调怎么选？"></a>问题 7：RAG 和微调怎么选？</h2><p>可以回答：</p><blockquote><p>如果问题是让模型掌握私有知识、实时知识或频繁变化的业务资料，优先用 RAG；如果问题是让模型学习固定的回答风格、格式或特定任务能力，可以考虑微调。RAG 的优势是知识可更新、可追溯、成本较低；微调的优势是模型行为更稳定，但不适合频繁注入新知识</p></blockquote><p>可以回答：</p><blockquote><p>如果问题是让模型掌握私有知识、实时知识或频繁变化的业务资料，优先用 RAG；如果问题是让模型学习固定的回答风格、格式或特定任务能力，可以考虑微调。RAG 的优势是知识可更新、可追溯、成本较低；微调的优势是模型行为更稳定，但不适合频繁注入新知识</p></blockquote>]]>
    </content>
    <id>https://fishmoun.github.io/2026/05/06/rag%E7%9F%A5%E8%AF%86%E7%82%B9%E6%9F%A5%E6%BC%8F%E8%A1%A5%E7%BC%BA/</id>
    <link href="https://fishmoun.github.io/2026/05/06/rag%E7%9F%A5%E8%AF%86%E7%82%B9%E6%9F%A5%E6%BC%8F%E8%A1%A5%E7%BC%BA/"/>
    <published>2026-05-06T15:33:03.180Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>本文章是对RAG的系统学习的相关笔记</p>
<p><strong>RAG</strong></p>
<p>检索增强生成</p>
<p><s]]>
    </summary>
    <title>[object Object]</title>
    <updated>2026-05-06T15:33:03.180Z</updated>
  </entry>
  <entry>
    <author>
      <name>FishMoun</name>
    </author>
    <category term="笔试刷题" scheme="https://fishmoun.github.io/categories/%E7%AC%94%E8%AF%95%E5%88%B7%E9%A2%98/"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>这是华为的笔试刷题笔记1</p><p>题目包括：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">2026年1月22日-100分-投资最大收益周期</span><br><span class="line">2025年7月9日-300分-无线网络覆盖计划</span><br><span class="line">2024年11月20日-200分-服务器休息计划</span><br><span class="line">2022年10月12日-100分-D路通信</span><br><span class="line">2025年10月17日-100分-奖品兑换组合</span><br><span class="line">2025年5月14日-200分-游戏中的地图穿越</span><br><span class="line">2025年6月11日-200分-网络整改</span><br><span class="line">2025年6月11日-300分-命令行参数提示</span><br><span class="line">2023年10月12日-200分-滑雪冒险</span><br><span class="line">2023年05月10日-300分-快乐校园跑</span><br></pre></td></tr></table></figure><h2 id="题目详解"><a href="#题目详解" class="headerlink" title="题目详解"></a>题目详解</h2><p><strong>1）投资最大收益周期</strong></p><p>常规动态规划，转移方程为dp[i] &#x3D; max(dp[i - 1] + nums[i], nums[i]);</p><p>本题是取一段连续的最大子数组，因此考虑是否加入nums[i]</p><p><strong>2）无线网络覆盖计划</strong></p><p>本题是典型的01背包问题：<strong>倒序遍历</strong></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">zeroOneKnapsack</span><span class="params">(<span class="type">int</span>[] weight, <span class="type">int</span>[] value, <span class="type">int</span> bagSize)</span> &#123;</span><br><span class="line">        <span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> weight.length;</span><br><span class="line">        <span class="type">int</span>[] dp = <span class="keyword">new</span> <span class="title class_">int</span>[bagSize + <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            <span class="comment">// 01 背包容量必须倒序遍历</span></span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> bagSize; j &gt;= weight[i]; j--) &#123;</span><br><span class="line">                dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> dp[bagSize];</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="type">int</span>[] weight = &#123;<span class="number">1</span>, <span class="number">3</span>, <span class="number">4</span>&#125;;</span><br><span class="line">        <span class="type">int</span>[] value = &#123;<span class="number">15</span>, <span class="number">20</span>, <span class="number">30</span>&#125;;</span><br><span class="line">        <span class="type">int</span> <span class="variable">bagSize</span> <span class="operator">=</span> <span class="number">4</span>;</span><br><span class="line"></span><br><span class="line">        System.out.println(zeroOneKnapsack(weight, value, bagSize)); <span class="comment">// 35</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>3）服务区休息计划</strong></p><p>dp[i]表示在第i个服务区休息的情况下的最小花费</p><p>注意初始化dp时，前M个服务区初始化的dp值是它们本身的花费</p><p>最后取倒数M个服务区的最小花费即可</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span>&#123;</span><br><span class="line">        <span class="type">Scanner</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line">        <span class="type">int</span> <span class="variable">N</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">        <span class="type">int</span> <span class="variable">M</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">        <span class="type">int</span>[] cost = <span class="keyword">new</span> <span class="title class_">int</span>[N];</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; N; ++i)&#123;</span><br><span class="line">            cost[i] = in.nextInt();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span>[] dp = <span class="keyword">new</span> <span class="title class_">int</span>[N];</span><br><span class="line">        Arrays.fill(dp, Integer.MAX_VALUE);</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; Math.min(N, M); i++) &#123;</span><br><span class="line">            dp[i] = cost[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">1</span>; i &lt; N; ++i)&#123;</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> i - <span class="number">1</span>; j &gt;= i - M &amp;&amp; j &gt;= <span class="number">0</span>; --j)&#123;</span><br><span class="line">                dp[i] = Math.min(dp[i], dp[j] + cost[i]);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> <span class="variable">min</span> <span class="operator">=</span> Integer.MAX_VALUE;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> N - <span class="number">1</span>; i&gt;= N  - M  &amp;&amp; i &gt;= <span class="number">0</span> ;--i)&#123;</span><br><span class="line">            min = Math.min(min, dp[i]);</span><br><span class="line">        &#125;</span><br><span class="line">        System.out.println(min);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>4）D路通信</strong></p><p>注意最长公共子串和最长公共子序列的区别：</p><p>子串一定是连续的，因此如果当前i和j的字母不同，dp(i)(j)为0</p><p>对于最长公共子序列，需要将状态转移给dp(i-1)(j)或dp(i)(j-1)</p><p><strong>5）奖券兑换组合</strong></p><p>01背包：最多选1次</p><p>完全背包：可以选无限次</p><p>多重背包：最多选指定次数</p><p>本题是多重背包：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">dp[i][s] = dp[i - <span class="number">1</span>][s]</span><br><span class="line">         + dp[i - <span class="number">1</span>][s - v]</span><br><span class="line">         + dp[i - <span class="number">1</span>][s - 2v]</span><br><span class="line">         + ...</span><br><span class="line">         + dp[i - <span class="number">1</span>][s - cnt * v]</span><br></pre></td></tr></table></figure><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] agrs)</span>&#123;</span><br><span class="line">        <span class="type">Scanner</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line">        <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">        Map&lt;Integer, Integer&gt; map = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; len; ++i)&#123;</span><br><span class="line">            <span class="type">int</span> <span class="variable">value</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">            map.put(value, map.getOrDefault(value, <span class="number">0</span>) + <span class="number">1</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> <span class="variable">num</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">        <span class="type">int</span>[] dp = <span class="keyword">new</span> <span class="title class_">int</span>[num + <span class="number">1</span>];</span><br><span class="line">        dp[<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">for</span>(Map.Entry&lt;Integer, Integer&gt; e : map.entrySet())&#123;</span><br><span class="line">            <span class="type">int</span> <span class="variable">v</span> <span class="operator">=</span> e.getKey();</span><br><span class="line">            <span class="type">int</span> <span class="variable">cnt</span> <span class="operator">=</span> e.getValue();</span><br><span class="line">            <span class="type">int</span>[] next = <span class="keyword">new</span> <span class="title class_">int</span>[num + <span class="number">1</span>];</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; num + <span class="number">1</span>; ++i)&#123;</span><br><span class="line">                <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">k</span> <span class="operator">=</span> <span class="number">0</span>; k &lt;= cnt &amp;&amp; k * v &lt;= i; ++k)&#123;</span><br><span class="line">                    next[i] += dp[i - k * v];</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            dp = next;</span><br><span class="line">        &#125;</span><br><span class="line">        System.out.println(dp[num]);</span><br><span class="line">    &#125;</span><br><span class="line">  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol><li>方案数最开始初始化为1</li><li>熟悉Entry的写法</li><li>熟悉多重背包的写法</li></ol><p><strong>6）游戏中的地图穿越</strong></p><p>二维dp，但不能使用整型最大值，可能会出现溢出的情况</p><p><strong>7）网络整改（学习80min）</strong></p><p>错误代码,，错误原因在于移除节点后，剩余的节点有可能会升级成叶子节点</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">import java.util.*;</span><br><span class="line">public class Main&#123;</span><br><span class="line">    static int dis = 0;</span><br><span class="line">    public static void main(String[] args)&#123;</span><br><span class="line">        Scanner in = new Scanner(System.in);</span><br><span class="line">        int n = in.nextInt();</span><br><span class="line">        ArrayList&lt;List&lt;Integer&gt;&gt; list = new ArrayList&lt;&gt;();</span><br><span class="line">        for(int i = 0; i &lt; n; ++i)&#123;</span><br><span class="line">            list.add(new ArrayList&lt;&gt;());</span><br><span class="line">        &#125;</span><br><span class="line">        for(int i = 0; i &lt; n - 1; ++i)&#123;</span><br><span class="line">            int first = in.nextInt();</span><br><span class="line">            int second = in.nextInt();</span><br><span class="line">            list.get(first - 1).add(second);</span><br><span class="line">        &#125;</span><br><span class="line">        // ArrayList&lt;Integer&gt; edge = new ArrayList&lt;&gt;();</span><br><span class="line">        // for(int i = 0; i &lt; n; ++i)&#123;</span><br><span class="line">        //     if(list.get(i).size() == 0)</span><br><span class="line">        //         edge.add(i + 1);</span><br><span class="line">        // &#125;</span><br><span class="line">        ArrayList&lt;Integer&gt; distance = new ArrayList&lt;&gt;();</span><br><span class="line">        dfs(distance, list, 0);</span><br><span class="line">        //找到distance数组中出现次数最多的频率</span><br><span class="line">        Map&lt;Integer, Integer&gt; map = new HashMap&lt;&gt;();</span><br><span class="line">        for(int i = 0; i &lt; distance.size(); ++i)&#123;</span><br><span class="line">            map.put(distance.get(i), map.getOrDefault(distance.get(i), 0) + 1);</span><br><span class="line">        &#125;</span><br><span class="line">        ArrayList&lt;Integer&gt; ans = new ArrayList&lt;&gt;();</span><br><span class="line">        for(int cnt : map.values())&#123;</span><br><span class="line">            ans.add(cnt);</span><br><span class="line">        &#125;</span><br><span class="line">        ans.sort(Collections.reverseOrder());</span><br><span class="line">        System.out.println(distance.size() - ans.get(0));</span><br><span class="line">       </span><br><span class="line">        </span><br><span class="line">    &#125;</span><br><span class="line">    static void dfs(ArrayList&lt;Integer&gt; distance,ArrayList&lt;List&lt;Integer&gt;&gt; list , int root)&#123;</span><br><span class="line">        if(list.get(root).size() == 0)&#123;</span><br><span class="line">            distance.add(dis);</span><br><span class="line">        &#125;</span><br><span class="line">        for(int i = 0; i &lt; list.get(root).size(); ++i)&#123;</span><br><span class="line">            dis++;</span><br><span class="line">            dfs(distance, list, list.get(root).get(i) - 1);</span><br><span class="line">            dis--;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://raw.githubusercontent.com/FishMoun/ImageStorage/main/picGo/image-20260504165558487.png" alt="image-20260504165558487"></p><p>正确代码如下：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span>&#123;</span><br><span class="line">    <span class="keyword">static</span> List&lt;List&lt;Integer&gt;&gt; adj;</span><br><span class="line">    <span class="keyword">static</span> List&lt;List&lt;Integer&gt;&gt; children;</span><br><span class="line">    <span class="keyword">static</span> <span class="type">int</span> <span class="variable">maxDepth</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">static</span> <span class="type">int</span>[] depth;</span><br><span class="line">    <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">dfs</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> p)</span>&#123;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> v : adj.get(u))&#123;</span><br><span class="line">            <span class="keyword">if</span>(v == p)</span><br><span class="line">                <span class="keyword">continue</span>;</span><br><span class="line">            depth[v] = depth[u] + <span class="number">1</span>;</span><br><span class="line">            maxDepth = Math.max(depth[v], maxDepth);</span><br><span class="line">            children.get(u).add(v);</span><br><span class="line">            dfs(v, u);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span>&#123;</span><br><span class="line">        <span class="type">Scanner</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line">        <span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">        adj = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt;= n; ++i)</span><br><span class="line">            adj.add(<span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;());</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; n - <span class="number">1</span>; ++i)&#123;</span><br><span class="line">            <span class="type">int</span> <span class="variable">first</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">            <span class="type">int</span> <span class="variable">second</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">            adj.get(first).add(second);</span><br><span class="line">        &#125;   </span><br><span class="line">        depth = <span class="keyword">new</span> <span class="title class_">int</span>[n + <span class="number">1</span>];</span><br><span class="line">        children = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt;= n; ++i) children.add(<span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;());</span><br><span class="line">        dfs(<span class="number">1</span>, <span class="number">0</span>);</span><br><span class="line">        <span class="type">int</span> <span class="variable">ans</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">        List&lt;List&lt;Integer&gt;&gt; byDepth = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt;= maxDepth; ++i) byDepth.add(<span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;());</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">v</span> <span class="operator">=</span> <span class="number">1</span>; v &lt;= n; ++v) byDepth.get(depth[v]).add(v);</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">h</span> <span class="operator">=</span> <span class="number">0</span>; h &lt;= maxDepth; ++h)&#123;</span><br><span class="line">            <span class="type">int</span>[] best = <span class="keyword">new</span> <span class="title class_">int</span>[n + <span class="number">1</span>];</span><br><span class="line">            Arrays.fill(best, Integer.MIN_VALUE/<span class="number">2</span>);</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">d</span> <span class="operator">=</span> maxDepth; d &gt;= <span class="number">0</span>; d--)&#123;</span><br><span class="line">                <span class="keyword">for</span>(<span class="type">int</span> v: byDepth.get(d))&#123;</span><br><span class="line">                    <span class="keyword">if</span>(d &gt; h)&#123;</span><br><span class="line">                        best[v] = Integer.MIN_VALUE/<span class="number">2</span>;</span><br><span class="line">                    &#125;<span class="keyword">else</span> <span class="keyword">if</span>(d == h)&#123;</span><br><span class="line">                        best[v] = <span class="number">1</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">else</span>&#123;</span><br><span class="line">                        <span class="type">int</span> <span class="variable">sum</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">                        <span class="keyword">for</span>(<span class="type">int</span> u: children.get(v))&#123;</span><br><span class="line">                            <span class="keyword">if</span>(best[u] &gt; <span class="number">0</span>) sum += best[u];</span><br><span class="line">                        &#125;</span><br><span class="line">                        best[v] = (sum &gt; <span class="number">0</span> ? sum + <span class="number">1</span>: Integer.MIN_VALUE/<span class="number">2</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            ans = Math.max(ans, best[<span class="number">1</span>]);</span><br><span class="line">        &#125;</span><br><span class="line">        System.out.println(n - ans);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>核心思路</strong></p><p>1、树型dp</p><p>2、删除最少 转换成保留最多</p><p><strong>8）命令行参数提示</strong></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span>&#123;</span><br><span class="line">    <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">Node</span>&#123;</span><br><span class="line">        <span class="type">int</span> index;</span><br><span class="line">        <span class="type">int</span> distance;</span><br><span class="line">        <span class="keyword">public</span> <span class="title function_">Node</span><span class="params">(<span class="type">int</span> i, <span class="type">int</span> d)</span>&#123;</span><br><span class="line">            index = i;</span><br><span class="line">            distance = d;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span>&#123;</span><br><span class="line">        <span class="type">Scanner</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line">        <span class="type">int</span> <span class="variable">D</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">        <span class="type">int</span> <span class="variable">N</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">        String[] demands = <span class="keyword">new</span> <span class="title class_">String</span>[N];</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; N; ++i)&#123;</span><br><span class="line">            demands[i] = in.next();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">String</span> <span class="variable">target</span> <span class="operator">=</span> in.next();</span><br><span class="line">        <span class="type">int</span>[] distances = <span class="keyword">new</span> <span class="title class_">int</span>[N];</span><br><span class="line">        <span class="type">boolean</span> <span class="variable">cnt</span> <span class="operator">=</span> <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; N; ++i)&#123;</span><br><span class="line">            distances[i] = editDistance(demands[i], target);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span>(distances[i] == <span class="number">0</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                System.out.println(demands[i]);</span><br><span class="line">                <span class="keyword">return</span>;</span><br><span class="line">            &#125;<span class="keyword">else</span> <span class="keyword">if</span>(distances[i] &lt;= D)&#123;</span><br><span class="line">                cnt = <span class="literal">true</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span>(!cnt)&#123;</span><br><span class="line">            System.out.println(<span class="string">&quot;None&quot;</span>);</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">            Node[] nodes = <span class="keyword">new</span> <span class="title class_">Node</span>[N];</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; N; ++i)&#123;</span><br><span class="line">                nodes[i] = <span class="keyword">new</span> <span class="title class_">Node</span>(i, distances[i]);</span><br><span class="line">            &#125;</span><br><span class="line">            Arrays.sort(nodes, (a, b) -&gt; &#123;</span><br><span class="line">                <span class="keyword">if</span> (a.distance != b.distance) &#123;</span><br><span class="line">                    <span class="keyword">return</span> Integer.compare(a.distance, b.distance);</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">return</span> demands[a.index].compareTo(demands[b.index]);</span><br><span class="line">            &#125;);</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; N; ++i)&#123;</span><br><span class="line">                <span class="keyword">if</span>(nodes[i].distance &lt;= D)&#123;</span><br><span class="line">                    System.out.print(demands[nodes[i].index] + <span class="string">&quot; &quot;</span>);</span><br><span class="line">                &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">editDistance</span><span class="params">(String mm, String nn)</span>&#123;</span><br><span class="line">        <span class="type">int</span> <span class="variable">m</span> <span class="operator">=</span> mm.length();</span><br><span class="line">        <span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> nn.length();</span><br><span class="line">        <span class="type">int</span>[][] dp = <span class="keyword">new</span> <span class="title class_">int</span>[m + <span class="number">1</span>][n + <span class="number">1</span>];</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; m + <span class="number">1</span>; ++i)&#123;</span><br><span class="line">            dp[i][<span class="number">0</span>] = i; </span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j &lt; n + <span class="number">1</span>; ++j)&#123;</span><br><span class="line">            dp[<span class="number">0</span>][j] = j;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">1</span>; i &lt; m + <span class="number">1</span>; ++i)&#123;</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">1</span>; j &lt; n + <span class="number">1</span>; ++j)&#123;</span><br><span class="line">                <span class="type">int</span> <span class="variable">left</span> <span class="operator">=</span> dp[i][j - <span class="number">1</span>] + <span class="number">1</span>;</span><br><span class="line">                <span class="type">int</span> <span class="variable">down</span> <span class="operator">=</span> dp[i - <span class="number">1</span>][j] + <span class="number">1</span>;</span><br><span class="line">                <span class="type">int</span> <span class="variable">leftDown</span> <span class="operator">=</span> dp[i - <span class="number">1</span>][j - <span class="number">1</span>];</span><br><span class="line">                <span class="keyword">if</span>(mm.charAt(i - <span class="number">1</span>) != nn.charAt(j - <span class="number">1</span>))</span><br><span class="line">                    leftDown += <span class="number">1</span>;</span><br><span class="line">                dp[i][j] = Math.min(left, Math.min(down, leftDown) );</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> dp[m][n];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol><li>注意在写边界+1的dp时的遍历终点</li><li>字典序用的是compareTo</li></ol><p><strong>9）滑雪冒险</strong></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span>&#123;</span><br><span class="line">    <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">Node</span>&#123;</span><br><span class="line">        <span class="type">int</span> h;</span><br><span class="line">        <span class="type">int</span> i;</span><br><span class="line">        <span class="type">int</span> j;</span><br><span class="line">        <span class="keyword">public</span> <span class="title function_">Node</span><span class="params">(<span class="type">int</span> h, <span class="type">int</span> i, <span class="type">int</span> j)</span>&#123;</span><br><span class="line">            <span class="built_in">this</span>.h = h;</span><br><span class="line">            <span class="built_in">this</span>.i = i;</span><br><span class="line">            <span class="built_in">this</span>.j = j;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span>&#123;</span><br><span class="line">        <span class="type">Scanner</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line">        <span class="type">int</span> <span class="variable">R</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">        <span class="type">int</span> <span class="variable">C</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">        <span class="type">int</span>[][] map = <span class="keyword">new</span> <span class="title class_">int</span>[R][C];</span><br><span class="line">        Node[] nodes = <span class="keyword">new</span> <span class="title class_">Node</span>[R * C];</span><br><span class="line">        <span class="type">int</span> <span class="variable">k</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; R; ++i)&#123;</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j &lt; C; ++j)&#123;</span><br><span class="line">                map[i][j] = in.nextInt();</span><br><span class="line">                nodes[k] = <span class="keyword">new</span> <span class="title class_">Node</span>(map[i][j], i, j);</span><br><span class="line">                k++;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        Arrays.sort(nodes, (a , b) -&gt; b.h - a.h);</span><br><span class="line"></span><br><span class="line">        <span class="type">int</span>[][] dp = <span class="keyword">new</span> <span class="title class_">int</span>[R][C];</span><br><span class="line">        <span class="type">int</span>[][] d = <span class="keyword">new</span> <span class="title class_">int</span>[][]&#123;&#123;-<span class="number">1</span>, <span class="number">0</span>&#125;,&#123;<span class="number">1</span>,<span class="number">0</span>&#125;,&#123;<span class="number">0</span>, -<span class="number">1</span>&#125;, &#123;<span class="number">0</span>, <span class="number">1</span>&#125;&#125;;</span><br><span class="line">        <span class="type">int</span> <span class="variable">max</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">1</span>; i &lt; R*C; ++i)&#123;</span><br><span class="line">            <span class="type">int</span> <span class="variable">h</span> <span class="operator">=</span> nodes[i].h;</span><br><span class="line">            <span class="type">int</span> <span class="variable">m</span> <span class="operator">=</span> nodes[i].i;</span><br><span class="line">            <span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> nodes[i].j;</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j &lt; <span class="number">4</span>; ++j)&#123;</span><br><span class="line">                <span class="type">int</span> <span class="variable">ii</span> <span class="operator">=</span> m + d[j][<span class="number">0</span>], jj = n + d[j][<span class="number">1</span>];</span><br><span class="line">                <span class="keyword">if</span>(ii &gt;= <span class="number">0</span> &amp;&amp; jj &gt;=<span class="number">0</span> &amp;&amp; ii &lt; R &amp;&amp; jj &lt; C &amp;&amp; map[ii][jj] &gt; h)&#123;</span><br><span class="line">                    dp[m][n] = Math.max(dp[m][n], dp[ii][jj] + <span class="number">1</span>);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            max = Math.max(max, dp[m][n]);</span><br><span class="line">        &#125;</span><br><span class="line">        System.out.println(max + <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>把最高点作为初始状态，然后依次遍历，是排序+动态规划</p><p>第二种方法是dfs+记忆化搜索</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> &#123;</span><br><span class="line">    <span class="comment">// 定义滑雪场的高度数组和记忆化数组</span></span><br><span class="line">    <span class="keyword">static</span> <span class="type">int</span>[][] g = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">210</span>][<span class="number">210</span>]; <span class="comment">// g[i][j]表示(i,j)点的高度</span></span><br><span class="line">    <span class="keyword">static</span> <span class="type">int</span>[][] f = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">210</span>][<span class="number">210</span>]; <span class="comment">// f[i][j]表示从(i,j)开始的最大滑雪路径长度</span></span><br><span class="line">    <span class="keyword">static</span> <span class="type">int</span> n, m; <span class="comment">// n为行数，m为列数</span></span><br><span class="line">    <span class="comment">// 四个方向的偏移量，分别是上、下、左、右</span></span><br><span class="line">    <span class="keyword">static</span> <span class="type">int</span>[] dx = &#123;-<span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span>&#125;, dy = &#123;<span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, -<span class="number">1</span>&#125;;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 深度优先搜索函数</span></span><br><span class="line">    <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">dfs</span><span class="params">(<span class="type">int</span> x, <span class="type">int</span> y)</span> &#123;</span><br><span class="line">        <span class="comment">// 如果该点的最大路径长度已经计算过，直接返回</span></span><br><span class="line">        <span class="keyword">if</span> (f[x][y] != -<span class="number">1</span>) <span class="keyword">return</span> f[x][y];</span><br><span class="line">        f[x][y] = <span class="number">1</span>; <span class="comment">// 初始化路径长度为1（包括当前点）</span></span><br><span class="line">        <span class="type">int</span> <span class="variable">t</span> <span class="operator">=</span> <span class="number">0</span>; <span class="comment">// 用于记录可达的最大路径长度</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">// 遍历四个相邻的方向</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; <span class="number">4</span>; i++) &#123;</span><br><span class="line">            <span class="type">int</span> <span class="variable">a</span> <span class="operator">=</span> dx[i] + x, b = dy[i] + y; <span class="comment">// 计算相邻点的坐标</span></span><br><span class="line">            <span class="comment">// 检查边界条件和高度条件，确保只向低于当前高度的点滑动</span></span><br><span class="line">            <span class="keyword">if</span> (a &lt; <span class="number">0</span> || a &gt;= n || b &lt; <span class="number">0</span> || b &gt;= m || g[a][b] &gt;= g[x][y]) <span class="keyword">continue</span>;</span><br><span class="line">            <span class="comment">// 递归调用DFS函数计算相邻点的最大路径长度</span></span><br><span class="line">            t = Math.max(t, dfs(a, b));</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 更新当前点的最大路径长度</span></span><br><span class="line">        f[x][y] += t;</span><br><span class="line">        <span class="keyword">return</span> f[x][y]; <span class="comment">// 返回当前点的最大路径长度</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="type">Scanner</span> <span class="variable">sc</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in); <span class="comment">// 创建输入扫描器</span></span><br><span class="line">        n = sc.nextInt(); <span class="comment">// 输入行数</span></span><br><span class="line">        m = sc.nextInt(); <span class="comment">// 输入列数</span></span><br><span class="line">        <span class="comment">// 输入每个点的高度</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j &lt; m; j++) &#123;</span><br><span class="line">                g[i][j] = sc.nextInt();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 初始化记忆化数组f为-1，表示尚未计算</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            Arrays.fill(f[i], -<span class="number">1</span>); <span class="comment">// 将每一行的所有值设置为-1</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> <span class="number">1</span>; <span class="comment">// 记录最长路径长度，初始为1</span></span><br><span class="line">        <span class="comment">// 对每个点调用DFS函数计算最大路径长度</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j &lt; m; j++) &#123;</span><br><span class="line">                res = Math.max(res, dfs(i, j)); <span class="comment">// 更新最长路径</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 输出最长滑雪路径长度</span></span><br><span class="line">        System.out.println(res);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>10）快乐校园跑（解题75min, 学习45min, 总时长120min）</strong></p><p>错误代码，且用时75min，试图用回溯思路解题，但过程中漏洞百出，需要加强回溯的写法，同时也要加强图论部分的学习</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span>&#123;</span><br><span class="line">    <span class="keyword">static</span> ArrayList&lt;ArrayList&lt;Integer&gt;&gt; paths = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span>&#123;</span><br><span class="line">        <span class="type">Scanner</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line">        <span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">        <span class="type">int</span> <span class="variable">m</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">        <span class="type">int</span>[][] runTimes = <span class="keyword">new</span> <span class="title class_">int</span>[n][n];</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; m; ++i)&#123;</span><br><span class="line">            <span class="type">int</span> <span class="variable">start</span> <span class="operator">=</span> in.nextInt() - <span class="number">1</span>;</span><br><span class="line">            <span class="type">int</span> <span class="variable">end</span> <span class="operator">=</span> in.nextInt() - <span class="number">1</span>;</span><br><span class="line">            <span class="type">int</span> <span class="variable">time</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">            runTimes[start][end] = time;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="type">int</span> <span class="variable">from</span> <span class="operator">=</span> in.nextInt();</span><br><span class="line">        <span class="type">boolean</span>[] visited = <span class="keyword">new</span> <span class="title class_">boolean</span>[n];</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; runTimes[from-<span class="number">1</span>].length; ++i)&#123;</span><br><span class="line">            <span class="keyword">if</span>(from != i + <span class="number">1</span> &amp;&amp; runTimes[from-<span class="number">1</span>][i] != <span class="number">0</span>)&#123;</span><br><span class="line">                ArrayList&lt;Integer&gt; path = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">                path.add(from);</span><br><span class="line">                dfs(runTimes, i + <span class="number">1</span>,visited, path);</span><br><span class="line">            &#125;</span><br><span class="line">            Arrays.fill(visited, <span class="literal">false</span>);</span><br><span class="line">               </span><br><span class="line">        &#125;</span><br><span class="line">         </span><br><span class="line">        <span class="comment">// 最多必经点数</span></span><br><span class="line">        Set&lt;Integer&gt; set = <span class="keyword">new</span> <span class="title class_">HashSet</span>&lt;&gt;();</span><br><span class="line">        <span class="type">int</span>[] totolTime = <span class="keyword">new</span> <span class="title class_">int</span>[paths.size()];</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; paths.size(); ++i)&#123;</span><br><span class="line">            List&lt;Integer&gt; path = paths.get(i);</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j &lt; path.size(); ++j)&#123;</span><br><span class="line">                <span class="type">int</span> <span class="variable">k</span> <span class="operator">=</span> path.get(j);</span><br><span class="line">                set.add(k);</span><br><span class="line">                <span class="keyword">if</span> (j != <span class="number">0</span>)</span><br><span class="line">                    totolTime[i] += runTimes[path.get(j - <span class="number">1</span>)][k] + runTimes[k][k];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        List&lt;Integer&gt; location_min_time = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> location : set)&#123;</span><br><span class="line">            <span class="type">int</span> <span class="variable">min</span> <span class="operator">=</span> Integer.MAX_VALUE;</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; paths.size(); ++i)&#123;</span><br><span class="line">                 List&lt;Integer&gt; path = paths.get(i);</span><br><span class="line">                <span class="keyword">if</span>(path.contains(location))&#123;</span><br><span class="line">                    min = Math.min(min, totolTime[i]);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            location_min_time.add(min);</span><br><span class="line">            </span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> <span class="variable">max</span> <span class="operator">=</span> Collections.max(location_min_time);</span><br><span class="line">        System.out.println(set.size());</span><br><span class="line">        System.out.println(max);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">dfs</span><span class="params">(<span class="type">int</span>[][] runTimes, <span class="type">int</span> from, <span class="type">boolean</span>[] visited, ArrayList&lt;Integer&gt; path)</span>&#123;</span><br><span class="line">        <span class="keyword">if</span>(visited[from - <span class="number">1</span>])&#123;</span><br><span class="line">            paths.add(<span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;(path));</span><br><span class="line">            </span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; runTimes[from-<span class="number">1</span>].length; ++i)&#123;</span><br><span class="line">            <span class="keyword">if</span>(from != i + <span class="number">1</span> &amp;&amp; runTimes[from-<span class="number">1</span>][i] != <span class="number">0</span>)&#123;</span><br><span class="line">              </span><br><span class="line">                path.add(from);</span><br><span class="line">                visited[from - <span class="number">1</span>] = <span class="literal">true</span>;</span><br><span class="line">                dfs(runTimes, i + <span class="number">1</span>, visited, path);</span><br><span class="line">            &#125;</span><br><span class="line">               </span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">    &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  </span><br><span class="line"></span><br></pre></td></tr></table></figure><p>正确思路：floyd最短路径</p><p><strong>算法模板：</strong></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//算法主体</span></span><br><span class="line">     <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">k</span> <span class="operator">=</span> <span class="number">1</span>; k &lt;= n; ++k)&#123;</span><br><span class="line">         <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">1</span>; i &lt;= n; ++i)&#123;</span><br><span class="line">             <span class="keyword">if</span>(f[i][k] == INF)</span><br><span class="line">                 <span class="keyword">continue</span>;</span><br><span class="line">             <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">1</span>; j &lt;= n; ++j)&#123;</span><br><span class="line">                 <span class="keyword">if</span>(f[k][j] == INF)</span><br><span class="line">                     <span class="keyword">continue</span>;</span><br><span class="line">                 <span class="keyword">if</span>(f[i][k] + f[k][j] &lt; f[i][j])</span><br><span class="line">                     f[i][j] = f[i][k] + f[k][j];</span><br><span class="line">             &#125; </span><br><span class="line">         &#125;</span><br><span class="line">     &#125;</span><br></pre></td></tr></table></figure><p><strong>本题核心</strong></p><p>1、建模成floyd算法问题（尤其是图中点的数量在100左右）</p><p>最多必经点数建模成floyd中的起点的可达点数</p><p>最终成绩时间建模成floyd中的起点到各个可达点的最小值</p><p>2、考虑小游戏时间添加到a-&gt;b的路径长度当中</p>]]>
    </content>
    <id>https://fishmoun.github.io/2026/05/06/%E5%8D%8E%E4%B8%BA%E7%AC%94%E8%AF%95%E5%88%B7%E9%A2%981/</id>
    <link href="https://fishmoun.github.io/2026/05/06/%E5%8D%8E%E4%B8%BA%E7%AC%94%E8%AF%95%E5%88%B7%E9%A2%981/"/>
    <published>2026-05-06T15:33:03.180Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>这是华为的笔试刷题笔记1</p>
<p>题目包括：</p>
<figure class="highlight plaintext"><tab]]>
    </summary>
    <title>华为笔试刷题1：动态规划</title>
    <updated>2026-05-06T15:33:03.180Z</updated>
  </entry>
  <entry>
    <author>
      <name>FishMoun</name>
    </author>
    <category term="笔试刷题" scheme="https://fishmoun.github.io/categories/%E7%AC%94%E8%AF%95%E5%88%B7%E9%A2%98/"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>这是华为的笔试刷题笔记2</p><p>题目包括：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">2024年9月11日-200分-圣诞节礼盒</span><br><span class="line">2023年10月12日-300分-塔子哥的分糖果方案</span><br><span class="line">2026年1月22日-300分-打怪升级</span><br><span class="line"></span><br><span class="line">2024年9月19日-300分-日志文件存储问题</span><br><span class="line">2025年12月3日-100分-数据匹配</span><br><span class="line">2025年12月4日-200分-奶茶店的超级收益日</span><br><span class="line">2024年10月16日-200分-求一组算子的最短执行时间</span><br><span class="line">2025年9月24日-100分-海蒂爷爷的木桶</span><br><span class="line">2025年11月9日-200分-一顿大餐的菜品选择方式</span><br><span class="line">2024年10月16日-200分-求最大括号表达式</span><br><span class="line">2023年09月23日-200分-迷宫</span><br></pre></td></tr></table></figure><h2 id="题目详解"><a href="#题目详解" class="headerlink" title="题目详解"></a>题目详解</h2><p><strong>圣诞节礼盒（15min思考 + 25min写+理解）</strong></p><p>排序+动态规划</p><p>dp含义是以第i个盒子为底从而能达到的最高的高度</p><p>注意这里dp[i]的初始值大小是它本身</p><p><strong>塔子哥的分糖果方案（40min学习）</strong></p><p>树型DP：</p><p>1、处理树的关键1：邻接表初始化</p>]]>
    </content>
    <id>https://fishmoun.github.io/2026/05/06/%E5%8D%8E%E4%B8%BA%E7%AC%94%E8%AF%95%E5%88%B7%E9%A2%982/</id>
    <link href="https://fishmoun.github.io/2026/05/06/%E5%8D%8E%E4%B8%BA%E7%AC%94%E8%AF%95%E5%88%B7%E9%A2%982/"/>
    <published>2026-05-06T15:33:03.180Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>这是华为的笔试刷题笔记2</p>
<p>题目包括：</p>
<figure class="highlight plaintext"><tab]]>
    </summary>
    <title>华为笔试刷题2：动态规划 + 模拟</title>
    <updated>2026-05-06T15:33:03.180Z</updated>
  </entry>
  <entry>
    <author>
      <name>FishMoun</name>
    </author>
    <category term="面试复盘" scheme="https://fishmoun.github.io/categories/%E9%9D%A2%E8%AF%95%E5%A4%8D%E7%9B%98/"/>
    <content>
      <![CDATA[<p>“D:\研究生\实习准备\录音\阿里三面文字版.docx”</p><h2 id="复盘准备"><a href="#复盘准备" class="headerlink" title="复盘准备"></a>复盘准备</h2><p>1）开启hermes + gpt5.5会话</p><p>2）材料：简历+面试复盘录音</p><p>3）目的：深度总结本次面试的经验，包括技术知识、语言表达、临场情绪等各方面</p><h2 id="AI智能体流程"><a href="#AI智能体流程" class="headerlink" title="AI智能体流程"></a>AI智能体流程</h2><p>1）将录音文字版结构化输出成md文档（）</p><p>2）结合结构化文档已经录音文字版逐个问题地去分析改进点（）</p><p>md文档地址：<a href="https://github.com/FishMoun/Interview-Review/tree/main/%E6%9A%91%E6%9C%9F%E5%AE%9E%E4%B9%A0-%E9%98%BF%E9%87%8C%E6%B7%98%E5%A4%A9%E4%B8%89%E9%9D%A2">Interview-Review&#x2F;暑期实习-阿里淘天三面 at main · FishMoun&#x2F;Interview-Review</a></p><h2 id="复盘分析"><a href="#复盘分析" class="headerlink" title="复盘分析"></a>复盘分析</h2><p>**目标：**通过阿里的三面，拿到offer</p><p>**结果：**未通过阿里的三面，情绪遭受了重创，且意识到身上存在的诸多不足</p><p><strong>原因：</strong></p><p>1）手撕没有写出来</p><p>2）项目demo、skill没有展示出来 </p><p>3）技术细节没有把握住：诸如对BM25的不熟悉</p><p>4）表达抓不住重点</p><p>5）业务理解不到位</p><p><strong>行动：</strong></p><p><strong>针对原因1</strong>：接下来每天都务必要完成五道手撕题的训练，针对重点常考题需要重点训练</p><p>**针对原因2：**在五一期间把两个项目都重新部署上线，并完善github仓库</p><p>**针对原因3：**在重构AI智能体项目时，重点关注RAG重构流程</p><p>**针对原因4：**刻意练习结构化的回答，背诵常见考点</p><p>**针对原因5：**在后续准备面试时，深入了解部门职能，包括它的父部门等</p><h2 id="AI智能体Skill使用"><a href="#AI智能体Skill使用" class="headerlink" title="AI智能体Skill使用"></a>AI智能体Skill使用</h2><p>hermes本次工作流中沉淀出一个面试复盘的skill，以后也会复用</p>]]>
    </content>
    <id>https://fishmoun.github.io/2026/05/06/%E9%98%BF%E9%87%8C%E4%B8%89%E9%9D%A2%E6%B7%B1%E5%BA%A6%E5%A4%8D%E7%9B%98/</id>
    <link href="https://fishmoun.github.io/2026/05/06/%E9%98%BF%E9%87%8C%E4%B8%89%E9%9D%A2%E6%B7%B1%E5%BA%A6%E5%A4%8D%E7%9B%98/"/>
    <published>2026-05-06T15:33:03.180Z</published>
    <summary>
      <![CDATA[<p>“D:\研究生\实习准备\录音\阿里三面文字版.docx”</p>
<h2 id="复盘准备"><a href="#复盘准备" class="headerlink" title="复盘准备"></a>复盘准备</h2><p>1）开启hermes + gpt5.5会话</p>]]>
    </summary>
    <title>阿里三面深度复盘</title>
    <updated>2026-05-06T15:33:03.180Z</updated>
  </entry>
  <entry>
    <author>
      <name>FishMoun</name>
    </author>
    <category term="AI智能体工作流" scheme="https://fishmoun.github.io/categories/AI%E6%99%BA%E8%83%BD%E4%BD%93%E5%B7%A5%E4%BD%9C%E6%B5%81/"/>
    <category term="AI Agent" scheme="https://fishmoun.github.io/tags/AI-Agent/"/>
    <category term="Camera Ready" scheme="https://fishmoun.github.io/tags/Camera-Ready/"/>
    <category term="LaTeX" scheme="https://fishmoun.github.io/tags/LaTeX/"/>
    <category term="Springer LNCS" scheme="https://fishmoun.github.io/tags/Springer-LNCS/"/>
    <category term="论文写作" scheme="https://fishmoun.github.io/tags/%E8%AE%BA%E6%96%87%E5%86%99%E4%BD%9C/"/>
    <content>
      <![CDATA[<h2 id="前言（本文内容由AI生成）"><a href="#前言（本文内容由AI生成）" class="headerlink" title="前言（本文内容由AI生成）"></a>前言（本文内容由AI生成）</h2><p>这篇文章记录一次使用 AI 智能体协助完成论文 camera-ready 版本筹备的完整过程。任务目标不是简单地让智能体“给建议”，而是让它直接参与本地文件处理：读取提交要求、整理 LaTeX 工程、修复编译问题、生成 PDF 和源码压缩包、检查 Springer 表格、根据 reviewer comments 规划并修改论文，最后输出一组可审阅、可追溯的辅助文档。</p><p>本次工作的原始目录位于：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">D:\研究生\科研\论文\camera-ready</span><br></pre></td></tr></table></figure><p>在 WSL 环境中的路径为：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/mnt/d/研究生/科研/论文/camera-ready</span><br></pre></td></tr></table></figure><p>最终形成了两个主要版本：</p><ul><li><code>v1/</code>：整理后的第一版 camera-ready LaTeX、PDF 和源码 zip；</li><li><code>v2/</code>：基于 reviewer comments 修改后的版本，以及实际改动记录、段落级前后对比、未完全处理项报告等辅助材料。</li></ul><h2 id="使用的-Skill"><a href="#使用的-Skill" class="headerlink" title="使用的 Skill"></a>使用的 Skill</h2><p>本次主要使用的智能体 Skill 是：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">latex-camera-ready-packaging</span><br></pre></td></tr></table></figure><p>这个 Skill 的作用是指导智能体完成 LaTeX camera-ready &#x2F; Springer LNCS &#x2F; EasyChair 相关工作，包括：</p><ul><li>检查提交要求和源码包；</li><li>在安全目录中解压和整理 LaTeX 工程；</li><li>识别主 <code>.tex</code> 文件、图片、BibTeX、class&#x2F;style 依赖；</li><li>编译并修复阻塞性 LaTeX&#x2F;BibTeX 错误；</li><li>验证 PDF 页数、参考文献起始页、A4&#x2F;Letter 页面大小；</li><li>清理不应上传的模板文件和构建产物；</li><li>生成最终 PDF 和 source zip；</li><li>检查 Springer copyright form；</li><li>基于 reviewer comments 生成修改计划；</li><li>实际修改 v2 论文，并记录 actual changes、before&#x2F;after、remaining gaps。</li></ul><p>它不是某一次任务临时生成的总结文档，而是一个可复用的工作流规范。智能体会根据这个 Skill 中的步骤执行具体操作。</p><h2 id="整体工作流概览"><a href="#整体工作流概览" class="headerlink" title="整体工作流概览"></a>整体工作流概览</h2><p>这次 camera-ready 准备过程可以拆成 8 个阶段：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">1. 读取 camera-ready 要求</span><br><span class="line">2. 整理和验证 v1 LaTeX/PDF/zip</span><br><span class="line">3. 拆分 LaTeX 章节</span><br><span class="line">4. 检查 Springer copyright form</span><br><span class="line">5. 分析 reviewer comments 并生成 review_action_plan.md</span><br><span class="line">6. 基于 review_action_plan.md 实际修改 v2</span><br><span class="line">7. 编译、验证并打包 v2</span><br><span class="line">8. 生成审阅辅助文档</span><br></pre></td></tr></table></figure><p>下面按阶段记录每一步的输入、处理方式和产出。</p><h2 id="阶段一：读取-camera-ready-要求"><a href="#阶段一：读取-camera-ready-要求" class="headerlink" title="阶段一：读取 camera-ready 要求"></a>阶段一：读取 camera-ready 要求</h2><p>首先，智能体读取了目录中的 <code>camera-ready.md</code>，确认 camera-ready 阶段需要提交的材料。</p><p>主要确认项包括：</p><ul><li>LaTeX source 或 RTF 源文件；</li><li>final PDF；</li><li>reviewer comments；</li><li>Springer copyright form；</li><li>EasyChair 上传材料。</li></ul><p>这一阶段的价值在于先确认“最终要交什么”，避免后续只生成 PDF，却遗漏源码压缩包或版权表格。</p><h2 id="阶段二：整理和验证-v1-LaTeX-PDF-zip"><a href="#阶段二：整理和验证-v1-LaTeX-PDF-zip" class="headerlink" title="阶段二：整理和验证 v1 LaTeX&#x2F;PDF&#x2F;zip"></a>阶段二：整理和验证 v1 LaTeX&#x2F;PDF&#x2F;zip</h2><p>用户提供的原始 LaTeX 包中，主文件仍使用模板式命名，例如 <code>samplepaper.tex</code>。智能体首先将源码解压到工作目录，再识别真正用于编译的主文件、图片、BibTeX 文件和 LNCS 模板依赖。</p><p>处理内容包括：</p><ol><li>解压原始 LaTeX zip；</li><li>识别主文件 <code>samplepaper.tex</code>；</li><li>检查依赖文件：<ul><li><code>llncs.cls</code>；</li><li><code>splncs04.bst</code>；</li><li><code>references.bib</code>；</li><li>论文中实际使用的 figures；</li></ul></li><li>安装缺失的 LaTeX 编译依赖；</li><li>修复 <code>references.bib</code> 中重复 BibTeX entry；</li><li>将主文件改名为 <code>main.tex</code>；</li><li>删除模板说明文件、未使用图片和构建产物；</li><li>生成 v1 PDF；</li><li>生成 v1 LaTeX source zip；</li><li>从干净目录重新编译验证。</li></ol><p>这一阶段的主要输出为：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">v1/latex/</span><br><span class="line">v1/LLM_Guided_Requirement_Scenario_Based_Testing_for_Simulink_Models_v1.pdf</span><br><span class="line">v1/LLM_Guided_Requirement_Scenario_Based_Testing_for_Simulink_Models_latex_v1.zip</span><br><span class="line">v1/changes_v1.md</span><br></pre></td></tr></table></figure><p>验证结果显示：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Pages: 18</span><br><span class="line">References: page 17</span><br><span class="line">正文页数: 16 pages excluding bibliography</span><br><span class="line">BUILD_OK</span><br></pre></td></tr></table></figure><p>也就是说，PDF 总页数为 18 页，参考文献从第 17 页开始，正文部分控制在 16 页以内，符合 “16 pages excluding bibliography” 的限制。</p><h2 id="阶段三：拆分-LaTeX-章节"><a href="#阶段三：拆分-LaTeX-章节" class="headerlink" title="阶段三：拆分 LaTeX 章节"></a>阶段三：拆分 LaTeX 章节</h2><p>为了便于后续根据 reviewer comments 逐章修改，智能体将原本集中在一个主文件中的论文内容拆分成多个章节文件。</p><p>处理后的结构大致为：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">v1/latex/main.tex</span><br><span class="line">v1/latex/sections/01_introduction.tex</span><br><span class="line">v1/latex/sections/02_running_example.tex</span><br><span class="line">v1/latex/sections/03_formal_definitions.tex</span><br><span class="line">v1/latex/sections/04_framework.tex</span><br><span class="line">v1/latex/sections/05_experimental_evaluation.tex</span><br><span class="line">v1/latex/sections/06_related_work.tex</span><br><span class="line">v1/latex/sections/07_conclusion.tex</span><br></pre></td></tr></table></figure><p>这样做的好处是后续修改更可控。比如 reviewer 提到 Running Example、Formal Definitions 或 Algorithm 的问题时，可以直接定位到对应章节文件，而不是在一个很长的 <code>main.tex</code> 中反复查找。</p><p>拆分后，智能体重新编译 PDF 并刷新 zip，避免因为结构调整导致最终上传包和 PDF 不一致。</p><h2 id="阶段四：Springer-copyright-form-处理"><a href="#阶段四：Springer-copyright-form-处理" class="headerlink" title="阶段四：Springer copyright form 处理"></a>阶段四：Springer copyright form 处理</h2><p>除论文源码和 PDF 外，camera-ready 还涉及 Springer copyright form。智能体对用户提供或下载的表格进行了检查。</p><p>检查内容包括：</p><ul><li>文件是否可以正常打开；</li><li><code>.docx</code> 和 <code>.pdf</code> 是否匹配；</li><li>PDF 页数是否正常；</li><li>签名区域是否存在明显问题；</li><li><code>Volume Editor(s)</code>、会议名称等字段是否需要进一步确认。</li></ul><p>这一步没有简单地把文件当作“已完成”，而是提醒了不确定字段。例如：Program Co-Chairs 不一定等同于 Volume Editors，因此相关字段最好以会议方或 Springer 通知为准。</p><h2 id="阶段五：分析-reviewer-comments-并生成修改计划"><a href="#阶段五：分析-reviewer-comments-并生成修改计划" class="headerlink" title="阶段五：分析 reviewer comments 并生成修改计划"></a>阶段五：分析 reviewer comments 并生成修改计划</h2><p>当用户提供 <code>Review.md</code> 后，智能体没有直接修改论文，而是先读取 reviewer comments 和当前 LaTeX 章节，生成了一个修改计划：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">v2/review_action_plan.md</span><br></pre></td></tr></table></figure><p>这个计划按照 reviewer comments 逐条分析，包含：</p><ul><li>reviewer 提出的具体问题；</li><li>当前论文中对应的位置；</li><li>可以在不新增实验的前提下进行的修改；</li><li>哪些内容不能凭空补充；</li><li>哪些要求只能写入 limitation、threats to validity 或 future work。</li></ul><p>本次用户明确要求“不进行额外实验分析”，因此智能体在计划中遵守了一个重要原则：</p><blockquote><p>不虚构实验结果，不编造 success rate、validity rate，也不声称完成了没有实际运行的多模型或 SOTA 对比实验。</p></blockquote><p>这个原则对学术论文修改非常关键。对于 reviewer 希望看到但当前无法新增实验支持的内容，正确处理方式是澄清方法、补充威胁、说明局限，而不是制造不存在的数据。</p><h2 id="阶段六：基于-review-action-plan-md-实际修改-v2"><a href="#阶段六：基于-review-action-plan-md-实际修改-v2" class="headerlink" title="阶段六：基于 review_action_plan.md 实际修改 v2"></a>阶段六：基于 review_action_plan.md 实际修改 v2</h2><p>在生成修改计划后，智能体复制 v1 LaTeX 工程作为 v2 工作区：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">v2/latex/</span><br></pre></td></tr></table></figure><p>然后按照修改计划逐章编辑。</p><h3 id="Running-Example"><a href="#Running-Example" class="headerlink" title="Running Example"></a>Running Example</h3><p>在 Running Example 中，主要补充和修正了：</p><ul><li>Triplex outputs 在 oracle checking &#x2F; fault detection 中的作用；</li><li>A1–A4 是 LLM 生成后经过检查和 normalization 的 actions；</li><li>RM-003、RM-004 的 scenario coverage；</li><li>若干标点和空格问题，例如 <code>.This</code>、<code>.Specifically</code> 这类排版错误。</li></ul><h3 id="Formal-Definitions"><a href="#Formal-Definitions" class="headerlink" title="Formal Definitions"></a>Formal Definitions</h3><p>在 Formal Definitions 中，补充了多个符号定义：</p><ul><li><code>Σ</code>；</li><li><code>σ</code>；</li><li><code>σ_S</code>；</li><li><code>ρ</code>；</li><li><code>I_T</code>；</li><li>STL 中的 <code>G</code> operator。</li></ul><p>同时还增加了 Triplex A3 formal action tuple 示例，并解释 scenario occurrence 是否允许 gap。当前实现采用 contiguous intervals，因此文中也进行了相应说明。</p><h3 id="Framework-Algorithms"><a href="#Framework-Algorithms" class="headerlink" title="Framework &#x2F; Algorithms"></a>Framework &#x2F; Algorithms</h3><p>Framework 章节是本次修改的重点之一。智能体补充了：</p><ul><li>LLM output schema 检查；</li><li>signal 检查；</li><li>STL parser 检查；</li><li>regeneration &#x2F; normalization 机制；</li><li><code>x1, x2, x3</code> 是测试生成阶段的搜索变量；</li><li>Algorithm 1 的重复行和模糊表达修正；</li><li>Algorithm 3 的 candidate generation、input bounds、candidate pool、maximum iterations 和 termination condition。</li></ul><p>此外，还增加了 <code>Compatible</code> &#x2F; compatibility check 的解释，用来回应 reviewer 对随机组合 scenario 是否可能 meaningless 的担忧。</p><h3 id="Experimental-Evaluation"><a href="#Experimental-Evaluation" class="headerlink" title="Experimental Evaluation"></a>Experimental Evaluation</h3><p>实验章节中主要完成了：</p><ul><li>修复 <code>DeepSeek [7]</code> 这类 citation 格式问题；</li><li>修复 citation after period 问题；</li><li>修复 Table 2 caption；</li><li>补充 RQ3 fault seeding protocol；</li><li>解释 NN 模型中 FRR 较低以及 baseline 为 0 的原因；</li><li>扩展 Threats to Validity。</li></ul><p>Threats 中特别补充了以下限制：</p><ul><li>未系统比较多个 LLM；</li><li>action extraction completeness 没有形式化保证；</li><li>STL constraint generation success rate 未系统报告；</li><li>scenario validity rate 未系统报告；</li><li>未覆盖所有 SOTA Simulink testing 方法；</li><li>ordered action sequences 对复杂 branching &#x2F; concurrent requirements 的表达能力有限。</li></ul><p>这些内容不是“补实验”，而是把方法边界说清楚。</p><h3 id="Related-Work"><a href="#Related-Work" class="headerlink" title="Related Work"></a>Related Work</h3><p>Related Work 部分扩展了与以下方向的对比：</p><ul><li>Simulink testing；</li><li>requirement-based testing；</li><li>scenario-based testing；</li><li>LLM-based testing。</li></ul><p>同时也明确说明，本文没有声称已经全面比较所有 SOTA 方法，而是强调本文方法与 random-search、constraint-solving、falsification、direct LLM test generation 的区别。</p><h3 id="Conclusion-and-Future-Work"><a href="#Conclusion-and-Future-Work" class="headerlink" title="Conclusion and Future Work"></a>Conclusion and Future Work</h3><p>Conclusion 中补充了 future work，包括：</p><ul><li>多 LLM 对比；</li><li>action completeness；</li><li>scenario validity；</li><li>branching &#x2F; concurrent scenario graphs；</li><li>更广泛地比较 Simulink falsification 和 model-based testing 方法。</li></ul><p>这些内容用于回应 reviewer 的合理担忧，同时避免把未完成的实验写成已有结果。</p><h2 id="Compatible-Check-的处理方式"><a href="#Compatible-Check-的处理方式" class="headerlink" title="Compatible Check 的处理方式"></a>Compatible Check 的处理方式</h2><p>Reviewer 对 scenario enhancement 中的随机组合提出了疑问：如果只是随机拼接 scenario，是否可能生成 meaningless scenario？</p><p>为回应这一点，v2 中将 <code>Compatible</code> check 写成一个轻量的 validity &#x2F; compatibility 过滤机制。其核心作用是在接受一个候选 scenario 之前，检查它是否满足基本语义和工程约束。</p><p>可以理解为：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">不是所有随机组合都会被接受；</span><br><span class="line">候选组合必须通过 compatibility check，才会进入增强后的 scenario set。</span><br></pre></td></tr></table></figure><p>检查内容包括：</p><ul><li>shared input&#x2F;output configuration 是否一致；</li><li>temporal feasibility 是否满足 <code>T_sim</code>；</li><li>是否保留 requirement traceability；</li><li>state-mode transition 是否合理；</li><li>constraint 是否在 input bounds 下可满足。</li></ul><p>这类补充不需要新增实验数据，但可以让方法描述更严谨。</p><h2 id="阶段七：编译、验证并打包-v2"><a href="#阶段七：编译、验证并打包-v2" class="headerlink" title="阶段七：编译、验证并打包 v2"></a>阶段七：编译、验证并打包 v2</h2><p>由于 v2 新增了不少 reviewer response 内容，初次编译后正文页数超出了 16 页限制。因此智能体进行了保守压缩：</p><ul><li>压缩 algorithm 环境占用；</li><li>缩短 Related Work 部分重复表达；</li><li>调整 <code>main.tex</code> 中部分 spacing；</li><li>保留实质性 reviewer clarifications，不用删除关键修改来硬凑页数。</li></ul><p>最终 v2 编译验证结果为：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Pages: 19</span><br><span class="line">Conclusion_page: 16</span><br><span class="line">References_page: 17</span><br><span class="line">ZIP_BUILD_OK</span><br></pre></td></tr></table></figure><p>这表示：</p><ul><li>PDF 总页数 19；</li><li>Conclusion 在第 16 页；</li><li>References 从第 17 页开始；</li><li>正文仍满足 16 页限制；</li><li>source zip 解压到干净目录后可以重新编译成功。</li></ul><p>v2 的主要输出包括：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">v2/latex/</span><br><span class="line">v2/LLM_Guided_Requirement_Scenario_Based_Testing_for_Simulink_Models_v2.pdf</span><br><span class="line">v2/LLM_Guided_Requirement_Scenario_Based_Testing_for_Simulink_Models_latex_v2.zip</span><br></pre></td></tr></table></figure><h2 id="阶段八：生成审阅辅助文档"><a href="#阶段八：生成审阅辅助文档" class="headerlink" title="阶段八：生成审阅辅助文档"></a>阶段八：生成审阅辅助文档</h2><p>为了让修改过程可追溯，智能体额外生成了多份 Markdown 文档。</p><h3 id="实际改动记录"><a href="#实际改动记录" class="headerlink" title="实际改动记录"></a>实际改动记录</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">v2/actual_changes_v2.md</span><br></pre></td></tr></table></figure><p>这份文档记录实际已经完成的修改，而不是只停留在计划层面。</p><h3 id="段落级前后对比"><a href="#段落级前后对比" class="headerlink" title="段落级前后对比"></a>段落级前后对比</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">v2/paragraph_before_after_v2.md</span><br></pre></td></tr></table></figure><p>这份文档按 LaTeX 文件分类，列出 v1 修改前段落和 v2 修改后段落，包含 27 个 change blocks，适合用于写 response letter 或人工复查。</p><h3 id="未完全落实项报告"><a href="#未完全落实项报告" class="headerlink" title="未完全落实项报告"></a>未完全落实项报告</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">v2/remaining_review_gaps_v2.md</span><br></pre></td></tr></table></figure><p>这份文档区分了：</p><ul><li>已经通过文字说明或方法澄清处理的问题；</li><li>只能作为 limitation &#x2F; future work 的问题；</li><li>如果有时间可以继续增强的呈现问题。</li></ul><p>其中未完全落实的主要是需要额外实验或统计的数据类要求，例如：</p><ul><li>多 LLM 对比；</li><li>更多 SOTA Simulink &#x2F; model-based testing 方法对比；</li><li>STL constraint generation success rate；</li><li>scenario enhancement validity rate。</li></ul><h3 id="工作流总结"><a href="#工作流总结" class="headerlink" title="工作流总结"></a>工作流总结</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">v2/agent_workflow_and_skills.md</span><br></pre></td></tr></table></figure><p>这就是本文整理依据的原始总结文档，记录了本次智能体的工作阶段、对应 Skill、关键约束和输出文件索引。</p><h2 id="关键工程约束"><a href="#关键工程约束" class="headerlink" title="关键工程约束"></a>关键工程约束</h2><p>这次任务中有几个值得记录的工程细节。</p><h3 id="中文路径问题"><a href="#中文路径问题" class="headerlink" title="中文路径问题"></a>中文路径问题</h3><p>论文工作目录包含中文路径：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/mnt/d/研究生/科研/论文/camera-ready</span><br></pre></td></tr></table></figure><p>部分终端工具不允许直接将包含中文字符的路径作为 <code>workdir</code>，因此编译验证时采用了复制到 <code>/tmp/...</code> 的方式。例如：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/tmp/camera_ready_v2_build</span><br><span class="line">/tmp/camera_ready_v2_zip_verify</span><br></pre></td></tr></table></figure><p>这样既避免路径问题，也能顺便完成 clean rebuild 验证。</p><h3 id="不新增实验"><a href="#不新增实验" class="headerlink" title="不新增实验"></a>不新增实验</h3><p>用户明确要求不进行额外实验分析。因此，对于 reviewer 提出的多模型比较、success rate、validity rate 等要求，智能体没有虚构数据，而是通过以下方式处理：</p><ul><li>方法说明；</li><li>threat to validity；</li><li>limitation；</li><li>future work。</li></ul><p>这保证了论文修改的学术诚信。</p><h3 id="页数限制"><a href="#页数限制" class="headerlink" title="页数限制"></a>页数限制</h3><p>Springer LNCS &#x2F; TASE camera-ready 要求正文 16 页以内，不含 bibliography。v2 增补 reviewer response 后一度超页，因此需要重新压缩。</p><p>最终采用的策略是优先压缩排版和重复表达，而不是删掉关键 reviewer response。</p><h2 id="最终产物索引"><a href="#最终产物索引" class="headerlink" title="最终产物索引"></a>最终产物索引</h2><p>本次任务的主要产物如下。</p><h3 id="v1-产物"><a href="#v1-产物" class="headerlink" title="v1 产物"></a>v1 产物</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">v1/latex/</span><br><span class="line">v1/LLM_Guided_Requirement_Scenario_Based_Testing_for_Simulink_Models_v1.pdf</span><br><span class="line">v1/LLM_Guided_Requirement_Scenario_Based_Testing_for_Simulink_Models_latex_v1.zip</span><br><span class="line">v1/changes_v1.md</span><br></pre></td></tr></table></figure><h3 id="v2-产物"><a href="#v2-产物" class="headerlink" title="v2 产物"></a>v2 产物</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">v2/review_action_plan.md</span><br><span class="line">v2/latex/</span><br><span class="line">v2/LLM_Guided_Requirement_Scenario_Based_Testing_for_Simulink_Models_v2.pdf</span><br><span class="line">v2/LLM_Guided_Requirement_Scenario_Based_Testing_for_Simulink_Models_latex_v2.zip</span><br><span class="line">v2/actual_changes_v2.md</span><br><span class="line">v2/paragraph_before_after_v2.md</span><br><span class="line">v2/remaining_review_gaps_v2.md</span><br><span class="line">v2/agent_workflow_and_skills.md</span><br></pre></td></tr></table></figure><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>这次工作展示了一种比较实用的 AI 智能体协作方式：不是只让模型回答“应该怎么做”，而是让它在明确约束下直接操作文件、编译验证、生成产物，并把每一步记录下来。</p><p>在论文 camera-ready 场景中，这种方式尤其适合处理以下任务：</p><ul><li>LaTeX 源码清理；</li><li>PDF 和 source zip 打包；</li><li>页数和引用检查；</li><li>reviewer comments 修改规划；</li><li>多版本 LaTeX 维护；</li><li>before&#x2F;after 修改记录；</li><li>remaining gaps 分析。</li></ul><p>不过，智能体也不能替代作者的学术判断。比如 Springer 表格中的不确定字段、reviewer 要求的新实验、论文结论的边界，都需要作者最终确认。比较理想的模式是：让智能体负责繁琐、可验证、可重复的工程化工作，让作者负责内容取舍、学术判断和最终提交确认。</p>]]>
    </content>
    <id>https://fishmoun.github.io/2026/05/01/%E6%99%BA%E8%83%BD%E4%BD%93%E5%B7%A5%E4%BD%9C%E6%B5%81-%E8%AE%BA%E6%96%87CameraReady%E7%89%88%E6%9C%AC%E7%AD%B9%E5%A4%87/</id>
    <link href="https://fishmoun.github.io/2026/05/01/%E6%99%BA%E8%83%BD%E4%BD%93%E5%B7%A5%E4%BD%9C%E6%B5%81-%E8%AE%BA%E6%96%87CameraReady%E7%89%88%E6%9C%AC%E7%AD%B9%E5%A4%87/"/>
    <published>2026-05-01T20:51:33.000Z</published>
    <summary>记录一次使用 AI 智能体协助完成论文 camera-ready 准备的完整流程，包括 LaTeX 源码整理、PDF 编译验证、Springer LNCS 检查、reviewer comments 修改、v2 打包与辅助文档生成。</summary>
    <title>智能体工作流1：论文 Camera-Ready 版本生成</title>
    <updated>2026-05-01T20:51:33.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>FishMoun</name>
    </author>
    <category term="个人项目" scheme="https://fishmoun.github.io/categories/%E4%B8%AA%E4%BA%BA%E9%A1%B9%E7%9B%AE/"/>
    <category term="Hexo" scheme="https://fishmoun.github.io/tags/Hexo/"/>
    <category term="GitHub Pages" scheme="https://fishmoun.github.io/tags/GitHub-Pages/"/>
    <category term="Icarus" scheme="https://fishmoun.github.io/tags/Icarus/"/>
    <content>
      <![CDATA[<p>一直想有一个轻量、可控、方便维护的个人博客，用来记录技术学习、项目实践和一些阶段性的思考。这次选择了 Hexo 作为静态博客框架，配合 Icarus 主题和 GitHub Pages 完成部署。</p><h2 id="技术选型"><a href="#技术选型" class="headerlink" title="技术选型"></a>技术选型</h2><p>这个博客的核心目标很简单：写作体验要轻，部署流程要稳定，后续维护成本要低。</p><p>因此整体方案采用：</p><ul><li>Hexo：负责将 Markdown 文章生成静态页面</li><li>Icarus：提供博客主题、侧边栏、导航和文章布局</li><li>GitHub Pages：托管生成后的静态站点</li><li>GitHub Actions：在推送代码后自动构建并发布</li></ul><p>这种方式不需要单独购买服务器，也不需要维护数据库。文章以 Markdown 文件保存，版本记录由 Git 管理，迁移和备份都比较直接。</p><h2 id="搭建过程"><a href="#搭建过程" class="headerlink" title="搭建过程"></a>搭建过程</h2><p>项目初始化后，主要完成了站点基础配置、主题配置和线上发布流程。</p><p>站点配置中设置了博客标题、作者、语言、站点地址和文章链接格式。主题配置中调整了导航栏、个人资料卡片、社交链接和侧边栏组件，让页面更接近个人博客的实际使用场景。</p><p>头像使用 GitHub 用户头像：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">avatar:</span> <span class="string">https://github.com/FishMoun.png</span></span><br><span class="line"><span class="attr">avatar_rounded:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>这样 GitHub 头像更新后，博客侧边栏也会跟着使用最新头像。</p><h2 id="清理默认组件"><a href="#清理默认组件" class="headerlink" title="清理默认组件"></a>清理默认组件</h2><p>Icarus 主题默认包含一些可选组件，例如 AdSense 广告位、FeedBurner 邮件订阅和 follow.it 订阅框。如果这些服务没有配置完整，页面上会出现无效提示或空表单。</p><p>这次将未使用的广告位和邮件订阅组件去掉，只保留 GitHub 链接和 RSS 订阅入口。这样页面更简洁，也避免读者看到不可用的功能。</p><h2 id="文章分类"><a href="#文章分类" class="headerlink" title="文章分类"></a>文章分类</h2><p>博客已经支持分类功能。文章只需要在 Front Matter 中加入 <code>categories</code> 字段，就会自动出现在分类页面中。</p><p>例如本文的分类配置：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">categories:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">个人项目</span></span><br></pre></td></tr></table></figure><p>后续如果继续记录项目搭建、工具使用或实践复盘，可以按照主题拆分为不同分类，方便长期整理。</p><h2 id="本地开发与线上部署"><a href="#本地开发与线上部署" class="headerlink" title="本地开发与线上部署"></a>本地开发与线上部署</h2><p>本地开发时可以先启动预览服务：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm run server</span><br></pre></td></tr></table></figure><p>访问 <code>http://localhost:4000/</code> 就可以查看效果。主题配置修改后，如果页面没有变化，通常需要重启 Hexo 服务，或者在浏览器中强制刷新。</p><p>确认无误后，再将改动提交并推送到 GitHub。GitHub Actions 会自动执行构建，将 <code>public</code> 目录中的静态页面发布到 GitHub Pages。</p><h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>这次博客搭建完成了从本地配置、主题调整、头像替换、组件清理到线上部署的完整流程。后续重点会放在内容本身：持续记录项目实践，把零散经验沉淀成可回顾、可复用的文章。</p>]]>
    </content>
    <id>https://fishmoun.github.io/2026/05/01/%E6%9E%84%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/</id>
    <link href="https://fishmoun.github.io/2026/05/01/%E6%9E%84%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/"/>
    <published>2026-05-01T17:28:35.000Z</published>
    <summary>
      <![CDATA[<p>一直想有一个轻量、可控、方便维护的个人博客，用来记录技术学习、项目实践和一些阶段性的思考。这次选择了 Hexo 作为静态博客框架，配合 Icarus 主题和 GitHub Pages 完成部署。</p>
<h2 id="技术选型"><a href="#技术选型" class]]>
    </summary>
    <title>构建个人博客</title>
    <updated>2026-05-06T15:33:03.180Z</updated>
  </entry>
</feed>
