列出后续方法
List Subsequents Method
所以,我必须找到连续子集的最大总和,我在python中遵循了这个算法。
def SubSeq(list):
final_list = None
suming = 0
for start in range(len(list)):
for end in range(start+1, len(list)+1):
subseq = list[start:end]
summation= sum(list[start:end])
if summation > suming:
suming = summation
final_list = subseq
return final_list
print SubSeq([5, 15, -30, 10, -5, 40, 10])
虽然 运行 时间是 O(n^2)
,但我想知道这是否是动态规划中的正确方法。另外,有没有办法让它成为 O(n)
这不是动态规划,它是一种蛮力解决方案。该解决方案似乎是正确的,但作为您的观察者 - 它效率低下。
一个O(n)的解决方案可以通过应用动态规划来实现,表示D(i)
作为以i
结尾的最大子连续子数组,并且必须包括i
。
D(-1) = 0
D(i) = max{ arr[i], D(i-1)
想法是,您有两个选择 - 获取以 i-1
结尾的先前 "best" 数组并向其添加元素 i
,或者创建一个以 i
开头的新数组i
.
最后,通过在DP解决方案中应用上述内容,您将得到一个数组,其中每个元素表示以该索引结尾的最大子连续数组,您所要做的就是从该数组中选择最大值得到最大和的值,然后返回数组得到实际的子序列。
示例:
array = 5,15,-30,10,-5,40,10
应用动态规划:
D(-1) = 0
D(0) = 5
D(1) = 20
D(2) = -10
D(3) 10 //because max{-10+10,10} = 10
D(4) = 5
D(5) = 45
D(6) = 55
现在你有了数组:
D = [5,20,-10,10,5,45,55]
最大子序列的值为 55,由 [10,-5,40,10]
给出(按照上面的数组,然后返回)
您基本上是在再次计算总和,again.You 可以通过将总和存储在数组中来避免这种情况。
您可以在 O(n) 中完成。
设S[0,1..n-1]为序列
设 T[0,1,...n-1] 为数组,其中 T[i] 是从第 i 个元素开始可能的最大连续和。
现在填充T[i],从反方向开始。 T[n-1]=max(S[n-1],0)
现在 T[i]=max(T[i+1]+S[i] , S[i] ,0)
现在遍历 'T' 数组以找到最大总和。
设T[m]为最大值。
要计算确切的序列,从S[m]开始,将所有元素相加,直到总和等于T[m]
所以,我必须找到连续子集的最大总和,我在python中遵循了这个算法。
def SubSeq(list):
final_list = None
suming = 0
for start in range(len(list)):
for end in range(start+1, len(list)+1):
subseq = list[start:end]
summation= sum(list[start:end])
if summation > suming:
suming = summation
final_list = subseq
return final_list
print SubSeq([5, 15, -30, 10, -5, 40, 10])
虽然 运行 时间是 O(n^2)
,但我想知道这是否是动态规划中的正确方法。另外,有没有办法让它成为 O(n)
这不是动态规划,它是一种蛮力解决方案。该解决方案似乎是正确的,但作为您的观察者 - 它效率低下。
一个O(n)的解决方案可以通过应用动态规划来实现,表示D(i)
作为以i
结尾的最大子连续子数组,并且必须包括i
。
D(-1) = 0
D(i) = max{ arr[i], D(i-1)
想法是,您有两个选择 - 获取以 i-1
结尾的先前 "best" 数组并向其添加元素 i
,或者创建一个以 i
开头的新数组i
.
最后,通过在DP解决方案中应用上述内容,您将得到一个数组,其中每个元素表示以该索引结尾的最大子连续数组,您所要做的就是从该数组中选择最大值得到最大和的值,然后返回数组得到实际的子序列。
示例:
array = 5,15,-30,10,-5,40,10
应用动态规划:
D(-1) = 0
D(0) = 5
D(1) = 20
D(2) = -10
D(3) 10 //because max{-10+10,10} = 10
D(4) = 5
D(5) = 45
D(6) = 55
现在你有了数组:
D = [5,20,-10,10,5,45,55]
最大子序列的值为 55,由 [10,-5,40,10]
给出(按照上面的数组,然后返回)
您基本上是在再次计算总和,again.You 可以通过将总和存储在数组中来避免这种情况。 您可以在 O(n) 中完成。
设S[0,1..n-1]为序列 设 T[0,1,...n-1] 为数组,其中 T[i] 是从第 i 个元素开始可能的最大连续和。
现在填充T[i],从反方向开始。 T[n-1]=max(S[n-1],0)
现在 T[i]=max(T[i+1]+S[i] , S[i] ,0)
现在遍历 'T' 数组以找到最大总和。
设T[m]为最大值。
要计算确切的序列,从S[m]开始,将所有元素相加,直到总和等于T[m]