1 条题解

  • 0
    @ 2025-10-26 14:21:06

    核心思路

    本题要求找出最长的加油站序列,使得任意连续 kk 个加油站中不出现重复的网络编号。这是一个典型的带约束的最长子序列问题。

    关键观察

    1. 状态表示:由于 k5k \leq 5,可以用一个长度为 k1k-1 的向量来表示最近选择的 k1k-1 个加油站网络编号序列
    2. 状态转移:对于每个新加油站,检查是否能加入到当前序列中而不违反约束

    重要公式与算法

    状态定义

    dp[vec]dp[vec] 表示以序列 vecvec(长度为 k1k-1)结尾的合法序列的最大长度,其中 vecvec 记录了最近 k1k-1 次加油的网络编号。

    约束条件

    对于新加油站 a[i]a[i],可以加入到以 vecvec 结尾的序列中当且仅当:

    a[i]veca[i] \notin vec

    这保证了加入 a[i]a[i] 后,新的连续 kk 个加油站(即 vecvec 中的所有元素加上 a[i]a[i])中没有重复网络。

    状态转移

    a[i]a[i] 可以加入时:

    dp[new_vec]=max(dp[new_vec],dp[vec]+1)dp[new\_vec] = \max(dp[new\_vec], dp[vec] + 1)

    其中 new_vecnew\_vec 是通过删除 vecvec 的第一个元素并在末尾添加 a[i]a[i] 得到的新序列。

    优化策略

    1. 空间优化:使用哈希表存储状态,避免存储所有可能的状态
    2. 剪枝优化:定期清理不可能达到最优解的状态
      • 如果某个状态的值与当前最大值相差超过 2k2k,可以删除
      • 只保留与当前活跃网络相关的状态

    算法复杂度

    • 状态数:O(nmk1)O(n \cdot m^{k-1}) 但实际远小于此上界
    • 时间复杂度:O(n状态数)O(n \cdot \text{状态数}),在约束下可行
    • 1

    信息

    ID
    4168
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者