整数列最长严格递增子序列问题是一个经典的算法问题。这个问题的目标是在一个给定的整数序列中,找到一个最长的严格递增子序列。
这个问题可以使用动态规划算法来解决,如果给定的整数列用data表示,算法具体步骤如下:
- 首先定义一个数组maxlength_list,用来记录到data[k] 且包含data[k]的最长子序列的长度。
- 计算maxlength_list[0]。
- 如果已经计算maxlength_list[0],...,maxlength_list[n],利用它们计算maxlength_list[n]。
计算公式是:
花括号表示的集合在程序中用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]