使用 dp 在某些条件下可能的数组数
number of possible arrays with certain conditions using dp
一个由 1
和 n
之间递增的自然数组成的数组,如果数组中的每个数字都可以被它的前一个数字整除,那么这个数组被称为美丽的。使用动态规划,问题是在给定的时间复杂度下找到大小为 k
的漂亮数组的数量:
O(n*k*root(n))
O(n*k*log(n))
对于第一个,我能想到的是可以用 O(root(n))
时间复杂度找到一个数的约数。我想设计一个递归算法来计算每个 i < k
可能的数组数量,但我不知道如何计算。
这个问题可以分为两部分:
求除数DAG(节点1…n,弧a→b 当且仅当 a 除
b)。 Trial division 会在 Θ(n √n);列举
倍数,以 Θ(n log n) 为单位。该图有 Θ(n log n) 弧。
计算一个DAG中长度为k的路径数。这是一个基本的
Θ((m + n) k)-时间动态规划。有一条路径长度
0 来自每个节点。来自每个节点的长度为 ℓ 的路径数是
来自其后继者的长度为 ℓ−1 的路径数的总和。
一个由 1
和 n
之间递增的自然数组成的数组,如果数组中的每个数字都可以被它的前一个数字整除,那么这个数组被称为美丽的。使用动态规划,问题是在给定的时间复杂度下找到大小为 k
的漂亮数组的数量:
O(n*k*root(n))
O(n*k*log(n))
对于第一个,我能想到的是可以用 O(root(n))
时间复杂度找到一个数的约数。我想设计一个递归算法来计算每个 i < k
可能的数组数量,但我不知道如何计算。
这个问题可以分为两部分:
求除数DAG(节点1…n,弧a→b 当且仅当 a 除 b)。 Trial division 会在 Θ(n √n);列举 倍数,以 Θ(n log n) 为单位。该图有 Θ(n log n) 弧。
计算一个DAG中长度为k的路径数。这是一个基本的 Θ((m + n) k)-时间动态规划。有一条路径长度 0 来自每个节点。来自每个节点的长度为 ℓ 的路径数是 来自其后继者的长度为 ℓ−1 的路径数的总和。