题目:
给定一个数组arr,可以从数组中取出下标不连续的任意个数,求可以取出的数的和的最大值。
例如,arr={1,2,2,5,3,4,3}可以取出的最大和为2+5+4=11。
给定数组{3,9,7,5,1,3,1,2,7},能取出的数的和的最大值是24。
(1)思路:
典型的动态规划,申请辅助数组dp,大小和原数组一致,代表:从原数组起始位置开始到当前下标位置截止 和的最大值。
则:dp[0] = arr[0]
dp[1] = max(arr[0], arr[1])
i > 1时
dp[i] = max(dp[i-1], dp[i-2]+arr[i])
(2) 代码实现 py2.7
def maxSum(arr):
if not arr: return
dp = [0]*len(arr)
dp[0] = arr[0]
dp[1] = max(arr[0], arr[1])
for i in range(2, len(arr)):
dp[i] = max(dp[i-1], dp[i-2]+arr[i])
return dp[-1]
测试结果
arr = [1,2,2,5,3,4,3]
print maxSum(arr)
#11
arr = [3,9,7,5,1,3,1,2,7]
print maxSum(arr)
#24