【发布时间】:2019-12-18 00:56:18
【问题描述】:
我的任务是用递归动态规划方法解决交替子字符串问题:
考虑一个整数序列 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+1} 如果 b{i-1} > b{i} 然后 b{i}
到目前为止,我需要检查每个递归步骤,如果我想获取元素并寻找下一个交替数字,或者我只是获取下一个数字并从两种可能的交替开始。
s 从左开始的索引 e结束(len(数组)) 一个数组 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)))
【问题讨论】:
-
问题和任务描述不清楚。
-
添加问题集
标签: algorithm runtime dynamic-programming topdown