题解 | #不相邻最大子序列和#
不相邻最大子序列和
http://www.nowcoder.com/practice/269b4dbd74e540aabd3aa9438208ed8d
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]