我的任务是用递归动态编程方法解决交替子字符串问题:
考虑一个整数序列 A = a1, a2, a3, ... an。a 的子序列 B 是一个序列 B = b1, b2, .... ,bn,它是通过删除一些元素但保持顺序从 A 创建的。给定一个整数序列 A,目标是计算 anb 交替子序列 B,即序列 b1, ... bn 使得对于 {2, 3, ... , m-1} 中的所有 i,如果 b{i- 1} < b{i} 然后 b{i} > b{i+1} 如果 b{i-1} > b{i} 然后 b{i} < b{i+1}
到目前为止,我需要检查每个递归步骤,如果我想获取元素并寻找下一个交替数字,或者我只是获取下一个数字并从两种可能的交替开始。
s index from left e end ( len(Array)) 一个数组 g(A,s) 一个函数,它得到下一个更大或更小的整数。
我的递归公式是:V(A, s, e) = max( V(A, g(A,s),e), V(A, s+1, e) ) +1
V(A, g(A,s),e) 获取元素并继续下一个交替
V(A, s+1, e) 离开元素并在下一个元素开始新序列
假设我的实现和方法是正确的,我建议将运行时间设置为 O(n^2),因为我们需要知道每个组合。
如果没有催眠部分,它将是 O(2^n),就像二叉树的叶子数量一样。
这个分析正确吗?可能只是对公式正确,但对代码不正确......
函数 getsmaller 和 getbigger 是 g(A,s)
A = [5,6,5,5,5,7,5,5,5,87,5]
s = 0
e = len(A)
memo_want_small = [-1] * len(A)
memo_want_bigger = [-1] * len(A)
def getsmaller(A, s):
erg = 0
for i in range(s, len(A)):
if A[i] < A[s]:
if i is not None:
return i
return -1
def getbigger(A, s):
for i in range(s, len(A)):
if A[i] > A[s]:
if i is not None:
return i
return -1
def wantsmall(A, s, e):
if s == -1: # no more alternating element
return 0
if s == e: # base case
return 0
if memo_want_small[s] is not -1:
return memo_want_small[s]
return_V = max(wantbigger(A, getbigger(A, s), e) , alt(A, s+1, e)) + 1
memo_want_small[s] = return_V
return return_V
def wantbigger(A, s, e):
if s == -1: # no more alternating element
return 0
if s == e: # base case
return 0
if memo_want_bigger[s] is not -1:
return memo_want_bigger[s]
return_V = max(wantsmall(A, getsmaller(A, s), e) , alt(A, s+1, e)) + 1
memo_want_bigger[s] = return_V
return return_V
def alt(A, s, e):
if s == e: # base case
return 0
return max(wantsmall(A, getsmaller(A, s), e), wantbigger(A, getbigger(A, s), e))
print("solution: " + str(alt(A,s,e)))