动态规划:求解整数序列最长严格递增子序列问题

整数列最长严格递增子序列问题是一个经典的算法问题。这个问题的目标是在一个给定的整数序列中,找到一个最长的严格递增子序列。

这个问题可以使用动态规划算法来解决,如果给定的整数列用data表示,算法具体步骤如下:

  1. 首先定义一个数组maxlength_list,用来记录到data[k] 且包含data[k]的最长子序列的长度。
  2. 计算maxlength_list[0]。
  3. 如果已经计算maxlength_list[0],...,maxlength_list[n],利用它们计算maxlength_list[n]。
    计算公式是:
    \[{\rm{lis}}\left[ i \right]{\rm{ }} = {\rm{ max}}\left( {​{\rm{lis}}\left[ j \right]} \right){\rm{ }} + {\rm{ }}1,{\rm{ }}j \in \left\{ {k: {\rm{ nums}}\left[ k \right]{\rm{ }} < {\rm{ nums}}\left[ i \right],{\rm{ }}k{\rm{ }} < {\rm{ }}i} \right\}\]
    花括号表示的集合在程序中用filtered 列表表示。

只显示最长子序列长度的算法: 

import random

def Maxlength_1(data):
    n = len(data)
    length_list = [0]*n
    for i in range(n):
        filtered = [k for k in range(i) if data[k] < data[i]]
        length_list[i] = 1
        for j in filtered: 
            if length_list[j] + 1 > length_list[i]:
                length_list[i] = length_list[j] + 1
    return max(length_list)

random.seed(1)
array = [random.randint(1,200) for _ in range(300)]
print('随机序列的最长严格递增子序列的长度是{}'.format(Maxlength_1(array)))

 返回结果是:

随机序列的最长严格递增子序列的长度是29

显示最长子序列的算法

import random

def Maxlength_2(data):
    n = len(data)
    maxlength_list = [0]*n # 记录到data[k] 且包含data[t]的最长子序列的长度。
    the_subs = {} # the_sub[k] = [到data[k]且包含data[k]的最长子序列]
    for i in range(n):
        filtered = [k for k in range(i) if data[k] < data[i]] 
        if filtered == []: # data[i] 前面没有比它小的。
            the_subs[i] = [data[i]] 
            maxlength_list[i] = 1
        else:
            q = 1
            for j in filtered: # data[i] 前面有比它小的。
                if maxlength_list[j] + 1 > q: 
                    q = maxlength_list[j] + 1
                    qq = j
            maxlength_list[i] = q
            the_subs[i] = the_subs[qq].copy()
            the_subs[i].append(data[i])
    return maxlength_list, the_subs

random.seed(1)
array = [random.randint(1,200) for _ in range(300)]
ss, tt = Maxlength_2(array)
print('随机序列的最长严格递增子序列的长度是{}'.format(max(ss)))
print('这个子序列是:{}'.format(tt[ss.index(max(ss))]))

返回结果:

随机序列的最长严格递增子序列的长度是29
这个子序列是:[1, 6, 7, 8, 9, 23, 28, 42, 44, 52, 53, 59, 66, 72, 75, 76, 83, 99, 108, 111, 115, 130, 140, 162, 167, 173, 189, 191, 200] 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值