华为 · 动态规划 · 算法编程题
华为 动态规划 时限 1 秒 / 256 MB

题目描述

你在为一门极少见的语言做专用分词。语言学家给出了一个“小词典”,每个条目都有一个分值,表示该词单独成词的合理性强弱。
同时,还收集了“相邻词对”的转移加分:当上一个词与下一个词按某种搭配出现时,整体会多(或少)一些分数。
你的目标是在给定的连续小写字母串中,切分出一条完整的词序列,使“词典分+转移加分”的总和最大。如果无法用词典完全覆盖整串,则输出0。

输入输出

输入描述
第一行:文本串 text,仅含小写英文字母。
第二行:整数 n,表示词典条目数。
接下来 n 行:每行一个词与其分值,中间用空格分隔。
接下来一行:整数 m,表示转移加分条目数。
接下来 m 行:每行包含“前词 后词 加分”,三者以空格分隔,加分可为负。
输出描述
一行,一个整数:最大可获得的总分。如果不存在任何完整切分,输出0。

样例共 1 组

样例 1 · · 最优切分:aa | ba | ba· 词典分:3 + 2 + 2 = 7 · 转移分:aa→ba = +2,ba→ba = -1 · 总分:7 + 2 - 1 = 8 · 其他可行切分(例如:a | ab | a | ba)· 词典分:1 + 2 + 1 + 2 = 6 · 转移分:ab→a = +1(其余未命中) · 总分:6 + 1 = 7 因此最优答案为 8。
输入
aababa
4
a 1
aa 3
ab 2
ba 2
3
aa ba 2
ba ba -1
ab a 1
输出
8

算法解析依据充分

考点:动态规划

限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:动态规划

本题切入点

带转移加权的分词问题:dp[i] = 以 i 结尾的最大总分,枚举上一个切分点 j,加上词典分与「上一个词 → 当前词」的转移加分;无法完全覆盖时答案为 0。

把问题拆成子问题,用状态表示「已处理到哪儿」,靠转移方程递推。

思路框架(动态规划 通法 · 非本题专属)

  1. 定义状态:dp[i] / dp[i][j] 表示什么(这是最关键的一步,状态定义错就全错)。
  2. 写转移方程:当前状态由哪些更小的状态推来。
  3. 确定初始条件与遍历顺序(保证用到的状态已算好)。
  4. 确定答案取哪个状态;数值大时全程取模。

实现要点:一般是「先枚举阶段,再枚举状态,最后枚举决策」三层循环;空间大时可滚动数组优化。

复杂度:时间 O(状态数 × 转移代价) | 空间 O(状态数)

该范式的通法易错点

  • 状态定义不完整(漏了必要维度),导致子问题之间有后效性。
  • 初始化写错(尤其「恰好」与「至多」的初值差别)。
  • 遍历顺序与依赖方向不一致。

样例解读

样例 1:输入 aababa / 4 / a 1 / aa 3 / ab 2 / ba 2 / 3 / aa ba 2 / ba ba -1 / ab a 1 → 输出 8

· 最优切分:aa | ba | ba· 词典分:3 + 2 + 2 = 7

· 转移分:aa→ba = +2,ba→ba = -1

· 总分:7 + 2 - 1 = 8

· 其他可行切分(例如:a | ab | a | ba)· 词典分:1 + 2 + 1 + 2 = 6

· 转移分:ab→a = +1(其余未命中)

· 总分:6 + 1 = 7

因此最优答案为 8。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2025年秋招-华为-9月17号AI岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解