Python2 解题
令 dp[i]=[a ,b]
a 表示是否使用第i个数字
b 表示前i个数组成的序列的最大和
动态规划的每一步需要分类讨论
如果dp[i-1]没有使用第i-1个数字(dp[i-1][0]==False),则看 dp[i-1], dp[i-1]+array[i], array[i] 哪个大
如果dp[i-1]使用了第i-1个数字(dp[i-1][0]==True),则看 dp[i-1], dp[i-2]+array[i], array[i] 哪个大
因为我们关心最大子序列的和,而dp[i] >= dp[i-1],因此其实不需要dp数组,我们只需要关注dp[i-2],dp[i-1]即可得到dp[i],即前i个数组形成的不相邻最大子序列和
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# 计算
# @param n int整型 数组的长度
# @param array int整型一维数组 长度为n的数组
# @return long长整型
#
# dp[i] = [a ,b] b表示前i个数组成的序列的最大和, a表示是否使用第i个数字
# dp[i] = if dp[i-1][0]: max(dp[i-1], dp[i-2]+array[i], array[i])
# else: max(dp[i-1], dp[i-1]+array[i], array[i])
class Solution:
def subsequence(self , n , array ):
# write code here
if n <= 2:
return max(array)
dp1 = [True, array[0]]
dp2_isused = False if array[0] >= array[1] else True
dp2_sum = max(array[0], array[1])
dp2 = [dp2_isused, dp2_sum]
for i in range(2, len(array)):
tmp_dp = []
if dp2[0]:
if dp2[1] >= dp1[1]+array[i] and dp2[1] >= array[i]:
tmp_dp = [False, dp2[1]]
else:
tmp_dp = [True, max(dp2[1], dp1[1]+array[i], array[i])]
else:
if array[i] > 0:
tmp_dp = [True, max(dp2[1] + array[i], array[i])]
else:
tmp_dp = [False, max(dp2[1], dp2[1] + array[i], array[i])]
dp1 = dp2
dp2 = tmp_dp
return dp2[1]
京公网安备 11010502036488号