具有约束的数字序列

时间:2017-02-14 13:37:45

标签: algorithm

我有一系列正数x_1,x_2,... x_n,我想找到一个连续的子序列,其中:0< x_i-x_j< i-j,1< = j< i< = n适用于所有i,j。将S(t)定义为以x_t ..

结尾的最长连续序列的长度

e.g。如果 S(t)= 3则上述情况适用于x_t,x_ {t-1},x_ {t-2}

我试图找到一个递归公式,我完全被卡住了。为了找到一些模式,我尝试用数字玩一下:

S(5)= 2意味着S(5)= 2 + S(4)和S(4)必须是$ 0 $。但是那么S(3)可能是1所以我们必须尽快停止我们发现S(4)= 0

基本情况或特殊情况S(0)= 0,S(1)= 0?

是否可以用S(k-1)来写S(k)?

我正在尝试为此构建一个算法,但首先我需要找出一个递归公式。

2 个答案:

答案 0 :(得分:0)

S(0)= 0
如果(x_n< = x_ {n-1}或x_n-x_ {n-1}> = 1)=> S(n)= 0
否则如果S(n-1)= 0 => S(n)= 2
否则S(n)= S(n-1)+ 1

答案 1 :(得分:0)

由于比较运算符的简单关系,在此问题中不需要动态编程或递归:它是可传递的。这意味着:

a < b and b < c => a < c

我们可以稍微改变上面的不等式:

x_i - x_j < i - j
x_i - i < x_j - j

这使整个问题变得更加简单:
定义序列y,其中y_i = x_i - i。找到以y_t结尾的最长严格递减序列。

由于严格递减序列中的传递性,您的条件始终成立,反之亦然。事实上,在这种情况下,这两个约束是等价的,因为不存在既减少又不违反序列约束的约束。因此,在这种情况下根本不需要递归,因为线性关系是完全足够的(传递性)。

当然,您可以将第一个非递减对的搜索转换为递归函数(尽管它比仅使用线性路径更复杂):

S(t) = {t = 0:                             0
        t = 1:                             1
        {x_t - t >= x_{t-1} - (t - 1)}:    1
        else:                              1 + S(t - 1)}