1 条题解

  • 0
    @ 2025-10-19 23:07:03

    这个问题可以看作是一个路径计数问题。由于列车只能从小编号城市开往大编号城市,整个图是一个有向无环图(DAG),我们可以使用动态规划来解决。

    动态规划解法 状态定义 设 dp[i] 表示从城市 ii 出发的所有不同旅程的数量(包括只包含城市 ii 本身的旅程)。

    状态转移 对于城市 ii,我们可以:

    只停留在城市 ii(计为 11 种旅程)

    乘坐列车前往任意可达的城市 jj,然后从 jj 继续旅程

    因此状态转移方程为:

    text dp[i] = 1 + ∑ dp[j] 对于所有从 i 可达的 j 计算顺序 由于列车只能从小编号城市前往大编号城市,我们应该从大到小计算 dp 值,即从城市 NN 计算到城市 11

    算法实现 基础版本 最直接的方法是对于每个城市 ii,枚举所有可能的 tt 值:

    python dp = [0] * (N + 1) dp[N] = 1 # 最后一个城市只有一种旅程:自身

    for i in range(N - 1, 0, -1): if d[i] == 0: # 列车停运 dp[i] = 1 else: dp[i] = 1 # 自身 t = 1 while t <= x[i] and i + t * d[i] <= N: j = i + t * d[i] dp[i] = (dp[i] + dp[j]) % MOD t += 1 优化考虑 当 did_i 很小而 xix_i 很大时,直接枚举 tt 可能会超时。需要进行优化:

    did_i 较大时,循环次数很少

    did_i 较小时,可以使用前缀和等技巧加速求和

    • 1

    信息

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