使用 dp 在某些条件下可能的数组数

number of possible arrays with certain conditions using dp

一个由 1n 之间递增的自然数组成的数组,如果数组中的每个数字都可以被它的前一个数字整除,那么这个数组被称为美丽的。使用动态规划,问题是在给定的时间复杂度下找到大小为 k 的漂亮数组的数量:

  1. O(n*k*root(n))
  2. O(n*k*log(n))

对于第一个,我能想到的是可以用 O(root(n)) 时间复杂度找到一个数的约数。我想设计一个递归算法来计算每个 i < k 可能的数组数量,但我不知道如何计算。

这个问题可以分为两部分:

  1. 求除数DAG(节点1…n,弧ab 当且仅当 ab)。 Trial division 会在 Θ(nn);列举 倍数,以 Θ(n log n) 为单位。该图有 Θ(n log n) 弧。

  2. 计算一个DAG中长度为k的路径数。这是一个基本的 Θ((m + n) k)-时间动态规划。有一条路径长度 0 来自每个节点。来自每个节点的长度为 ℓ 的路径数是 来自其后继者的长度为 ℓ−1 的路径数的总和。