动态规划----从求最长非降子序列的长度问题看动态规划的算法设计

最长非降子序列的长度问题

先给出问题:

比如现在有一组数,5,3,4,2,7,答案显然是3,序列是3,4,7

设计要素

1.问题建模,获得优化的目标函数。

2.划分子问题。

3.得到问题最优函数值与子问题的最优函数值的关系,也就是递推方程。

4.看是否存在最优子结构(不存在则不可以使用动态规划)

5.解决最小的子问题是什么,获取初值

算法设计:

1.设f(x) 为到x时的最长非降子序列

2.子问题显然就是按不断地减短问题序列了,如开始的5,3,4,2,然后5,3,4,如此类推,最后得到5

3.递推方程:f(x) = max{f(1),f(2),...f(j)+1},如过A[x]>A[j],那么那项要加1,j<x

4.显然存在最优子结构

5.初值为1

代码实现:

A = [5,3,4,1,8,2]  #给定序列

f = [1]*A.__len__() #f(x)

#通过计算子问题,最终得到结果
for i in range(A.__len__()):
    for j in range(i):
        if f[i] < f[j]:
            f[i] = f[j]
        if A[i]>A[j] and f[i] < f[j] + 1:
            f[i] = f[j] + 1

print(f)

猜你喜欢

转载自blog.csdn.net/aaalswaaa1/article/details/81327553