📅  最后修改于: 2023-12-03 14:58:35.720000             🧑  作者: Mango
给定一个长度为 $n$ 的正整数序列 $a_1, a_2, \cdots, a_n$,找出其中的一个子序列,使得该子序列的元素之和最大。注意不能选择相邻的两个元素。
第一行包含一个整数 $n$。
第二行包含 $n$ 个整数 $a_1, a_2, \cdots, a_n$。
输出一个整数,表示该子序列的元素之和的最大值。
5
1 2 3 4 5
9
题目描述了一个很明显的约束条件:不能选择相邻的两个元素,因此我们需要思考如何得到最优解。
有许多算法可以解决这个问题,其中最简单的算法就是动态规划。我们可以定义一个状态 $f_i$ 表示前 $i$ 个元素中,选出一个符合要求的子序列,且该子序列以第 $i$ 个元素为结尾时,元素之和的最大值。
最后,我们遍历所有的 $f_i$,并取最大值作为题目的答案。
n = int(input())
a = list(map(int, input().split()))
f = [0] * (n + 1)
f[1] = a[0]
for i in range(2, n + 1):
# 注意根据状态定义,不选第 i 个元素时 f[i] = f[i-1]
f[i] = max(f[i - 1], f[i - 2] + a[i - 1])
print(f[n])
该算法的时间复杂度为 $O(n)$,可通过本题。