动态规划系列(4)——不相邻数最大和

给定数组A=[1,2,4,1,7,8,3],求出数组A中互不相邻的数的最大和。

例如:如果选择了8,则不能选择7和3,在本例中最大的和为1+4+7+3=15

 分析,这是一道典型的使用动态规划求解的题目(当然能够使用万能的回溯法,但显然不是很棒),最优子结构为:

f(i)=max{f(i - 2) + A[i], f(i - 1)}

解释一下,对于第i位,如果选择A[i],则不能选择i-1位,因此有f(i - 2) + A[i],如果不选择A[i],则将该问题放缩到i-1,因此有f(i-1)。

对于边界情况,f(0) = A[0],f(1) = max{A[0], A[1]}

首先使用递归写法实现最基本的解法:

def f(i):
    if i == 0:  
        return A[0]
    if i == 1:
        return max(A[0], A[1])

    return max(A[i] + f(i - 2), f(i - 1)}

使用递归的写法终归效率太低下了,因此接下来使用自底向上的迭代方法来实现这个问题,使用长度为len(A)的数组来保存中间的值:

import numpy as np

A = [1,2,4,1,7,8,3]

def non_rec_f():
    opt = np.zeros(len(A))
    opt[0] = A[0]
    opt[1] = max(A[0], A[1])
    for i in range(2, len(A)):
        opt[i] = max(opt[i - 2] + arr[i], opt[i - 1])
    return opt[len(A) - 1]
发布了115 篇原创文章 · 获赞 96 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_26822029/article/details/90256166