【发布时间】:2017-06-14 14:14:20
【问题描述】:
我尝试使用回溯来解决这个问题,但我不确定算法的复杂性(以及算法是否正确)以及更复杂的算法。
给定 2 个正整数 n 和 m,如果满足以下条件,我们称合法整数序列:
- 序列长度为n
- 序列中的元素在 1 到 m 之间
- 序列中位置 i 的元素 1
计算合法序列的数量。算法的预期复杂度为 O(m² + nm)
这是我在 c 中的算法:
// n length of the sequence
// m maximum valid number
// l number of remaining positions in the sequence
// p previous number in the sequence
int legal(int n, int m, int l, int p) {
if (l == 0)
return 1;
int q=0;
for (int i=1; i <= m;i++) {
if (p%i == 0 || l == n)
q += legal(n,m,l-1,i);
}
return q;
}
int main() {
int n, m;
scanf("%d", &n);
scanf("%d", &m);
printf("%d\n", legal(n,m,n,0));
}
我认为我的算法的复杂度是 O(nmS(n)) 其中 S(n) = 合法序列的数量
【问题讨论】:
-
算法的代码或伪代码应该包含合理的名称或关于什么字母意味着什么的字典。评论也很有用。您发表的内容是对所有读者和可能的回答者的完全不礼貌。请添加解释。