我有一系列正数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)?
我正在尝试为此构建一个算法,但首先我需要找出一个递归公式。
答案 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)}