动态规划 求数组中不相邻元素的最大和

有一个数组:arr = [1, 2, 4, 1, 7, 8, 3]

找出相加最大的和,选择的数不能相邻

该数组解为 1,4,7,3  和为15

题解:

b站视频讲解

https://www.bilibili.com/video/BV12W411v7rd?from=search&seid=16185215057279292603

从最后一个来是按照递归的思想,动态规划的思想是从数组的第三个元素开始,选或不选,然后求最大值,将值赋给opt数组,如此循环直到arr数组的最后一个,结束,返回opt[-1],即本题答案

Python:

import numpy as np


def rec_opt(arr, i):  # 递归求解函数
    if i == 0:
        return arr[0]
    elif i == 1:
        return max(arr[0], arr[1])
    else:
        a = rec_opt(arr, i - 2) + arr[i]  # a为选择数组最后一个元素,然后只能选第i-2个元素
        b = rec_opt(arr, i - 1)  # b为不选最后一个元素,所以就选择第i-1个元素
        return max(a, b)


def dp_opt(arr):  # 动态规划求解函数
    opt = np.zeros(len(arr))
    opt[0] = arr[0]
    opt[1] = max(arr[0], arr[1])
    for i in range(2, len(arr)):
        a = opt[i - 2] + arr[i]
        b = opt[i - 1]
        opt[i] = max(a, b)
    return opt[len(arr) - 1]


arr = [1, 2, 4, 1, 7, 8, 3]
p = dp_opt(arr)
q = rec_opt(arr, 6)
print(p, end='\t')
print(q)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柒丨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值