python算法每日一练:动态规划02

一道动态规划(Dynamic Programming,DP)的算法题目。请注意,由于我无法直接提供图形或代码编辑器,我将以文字描述的方式呈现问题。

题目描述如下:

给定一个非负整数数组 nums,你需要选择其中的一些数字,使得选出的数字之和最大,且所选数字不能相邻。请你计算出最大的和。

例如,对于数组 nums = [1, 2, 3, 1],选择数字的最大和为 4,即选择第 1 个和第 3 个数字。

请你设计一个动态规划算法,解决这个问题,并输出最大的和。
“”"

解法:

找状态转移方程:

所选的数字不能相邻,如果选了第i个元素,最大和为 dp[i-2]+nums[i];
如果不选择第i个元素,最大和为dp[i-1]

确定初始值:

dp[0]=nums[0], dp[1]=max(nums[0],nums[1])
dp[n-1] 表示选择前 n 个数字时的最大和,其中 n 是数组的长度。

nums = [2, 3, 6, 8, 99]


def max_non_adjacent_sum(nums):
    n = len(nums)
    if n == 0:
        return 0
    elif n == 1:
        return nums[0]
    dp = n * [0]
    dp[0] = nums[0]
    dp[1] = max(dp[0], nums[1])
    for i in range(2, n):
        dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
    print(dp[n - 1])


max_non_adjacent_sum(nums)

你可能感兴趣的:(算法,python,动态规划)