nas*_*mat 3 python algorithm dynamic-programming
给定一个数字列表来找到时间复杂度为 o(n) 和空间复杂度为 o(1) 的非相邻元素的最大和,我可以使用这个:
sum1= 0
sum2= list[0]
for i in range(1, len(list)):
num= sum1
sum1= sum2+ list[i]
sum2= max(num, sum2)
print(max(sum2, sum1))
Run Code Online (Sandbox Code Playgroud)
此代码仅在 k = 1 [求和数之间只有一个元素] 时才有效,如何通过使用动态编程更改 k 值来改进它。其中 k 是求和数之间的元素数。例如:
列表 = [5,6,4,1,2] k=1 答案 = 11 # 5+4+2
列表 = [5,6,4,1,2] k=2 答案 = 8 # 6+2
列表 = [5,3,4,10,2] k=1 答案 = 15 # 5+10
可以用空间O(k)和时间O(nk)来解决这个问题。如果k是常数,则这符合您问题中的要求。
该算法从位置k + 1到n循环。(如果数组比那个短,显然可以在O(k) 中解决)。在每一步,它维护一个best长度为k + 1的数组,这样第j个条目best是迄今为止找到的最佳解决方案,这样它使用的最后一个元素至少是当前位置左侧的j 个。
初始化best是通过为其条目j设置数组中位置1, ..., k + 1 - j 中最大的非负条目来完成的。因此,例如,best[1]是位置1, ..., k 中最大的非负条目,并且best[k + 1]为 0。
当在数组的位置i时,是否使用元素i。如果使用,则best到目前为止相关的是best[1],所以写u = max(best[1] + a[i], best[1])。如果未使用元素i,则每个“至少”部分移动一个,因此对于j = 2, ..., k + 1 , best[j] = max(best[j], best[j - 1]). 最后,设置best[1] = u。
在算法终止时,解是 中最大的项best。