Select 来自集合 {1, 2,…, n} 的 K 个不同的数字使得

Select K distinct numbers from set {1, 2,…, n} such that

给定 n 和 k ,k<=n。
在多少种方法中,我们可以 select 从集合 {1, 2,…, n} 中精确地选择“k”个不同的数字,这样对于每个选择的数字“a”至少是“a-1”中的一个,“ a+1' 也被选中? 时间复杂度为 O(n*k) 的动态规划解决方案是 known.Can 我们做得更好?

是的,我们只需要做一点组合学。

定义一个运行是连续整数的最大子集。我们让 r 的范围从 1 到 floor(k/2) 并将子集的数量与 r 运行s.

相加

为了计算具有给定数量 运行s r 的子集的数量,我们采用 (a) 划分 运行 长度的方法数乘以 (b) 划分方法的数量分割 运行s.

之间的间隙

对于(a),将整数k划分为r个大于或等于2的整数之和的方法数为((k - 2r + (r - 1)) 选择(r - 1) ) 通过标准技术。

对于 (b),将整数 n - k 划分为 r + 1 个整数之和的方法数为 ((n - k - ( r - 1) + r) 选择 r).

天真地,这个公式需要 O(k^2) 次算术运算,但是如果我们使用 r - 1 的二项式系数来计算 r 的二项式系数,那么 运行ning 时间变为 O(k ) 算术运算。