最长非降子序列的长度问题
先给出问题:
比如现在有一组数,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)