题目:
输入一个列表,每个元素都是正数。从中选取部分元素,让他们的和最大。但相邻的两个元素不容许选取。例如:输入[14,3,27,4,5,15,1],选取14,27,15,总和56,这也是最大和。选取3,4,15,总和是22。选取3,27,15是不容许的,因为3和27是相邻的两个元素。
输入格式:
在一行中输入一个列表,如[14,3,27,4,5,15,1]。
输出格式:
对每一组输入,在一行中输出最大和。
输入样例:
在这里给出一组输入。例如:
[14,3,27,4,5,15,1]
结尾无空行
输出样例:
在这里给出相应的输出。例如:
56
思路 :
既然要求最大和,当然是
1.选取的值越大越好
2.选取的值越多越好
并且,我们只需要关心可选数值和不可选数值的关系:
若下标为 i 的数值可选,则 i+1 和 i-1 的数值不可选
因此,我们可以将数列按大小重排序得到一个从大到小的数列,同时排序时将数值的下标一同排序
图中元组(2,27)中,27代表数值,2代表该数值在原列表中的下标
接下来,我们将遍历新列表,从大到小,从左到右,并进行下列判断:
若数值下标 index 不在不可选集合里,则累加数值,同时将 index-1 和 index+1 传入集合
若不可选集合里存在该数值下标,则代表不可选该数值,继续遍历
------------------------------------------------------------分割线------------------------------------------------------------
代码:
def get_max_sum(lst):
r=set()
reverse_lst=sorted(enumerate(lst), key=lambda x:x[1],reverse=True)
print(reverse_lst)
sum=0
for x in reverse_lst:
if x[0] not in r:
sum+=x[1]
r.add(x[0]-1)
r.add(x[0]+1)
return sum
lst=eval(input())
print(get_max_sum(lst))



