n=int(input())
a=[int(i) for i in input().split()]
b=[0]*1010
k=0
for i in range(n):
p = -1
for j in range(k):
if a[i]<=b[j]:
p=j
break
if (p == -1):
b[k] = a[i]
k += 1
else:
b[p] = a[i]
print(k)
n = int(input())
a = [int(i) for i in input().split()]
n = int(input()):读取用户输入的一个整数n,表示整数序列的长度。
a = [int(i) for i in input().split()]:读取用户输入的一行数据,使用input().split()将输入的字符串按空格分割成多个子字符串,然后通过列表推导式将这些子字符串转换为整数,构成一个整数列表a。
(二)初始化部分
Python复制
b = [0] * 1010
k = 0
c = []
b = [0] * 1010:初始化一个长度为1010的列表b,用于存储当前最长递增子序列的末尾元素。1010是一个足够大的数,确保不会溢出。
k = 0:初始化一个计数器k,用于记录当前最长递增子序列的长度。
c = []:初始化一个空列表c,用于记录每个元素在最长递增子序列中的位置和值。
(三)动态规划部分
Python复制
for i in range(n):
p = -1
for j in range(k):
if a[i] <= b[j]:
p = j
break
if p == -1:
b[k] = a[i]
c.append([k, a[i]])
k += 1
else:
b[p] = a[i]
c.append([p, a[i]])
for i in range(n)::通过一个循环,遍历输入的整数序列a。
p = -1:初始化一个变量p为-1,用于记录当前元素a[i]在b中的插入位置。
for j in range(k)::通过一个内层循环,遍历当前最长递增子序列的末尾元素列表b。
if a[i] <= b[j]::如果当前元素a[i]小于或等于b[j],则找到插入位置。
p = j:将插入位置记录为j。
break:跳出内层循环。
if p == -1::如果p仍为-1,说明当前元素a[i]可以扩展最长递增子序列。
b[k] = a[i]:将a[i]添加到b的末尾。
c.append([k, a[i]]):记录当前元素的位置和值。
k += 1:更新最长递增子序列的长度。
else::如果p不为-1,说明当前元素a[i]可以替换b中的某个元素。
b[p] = a[i]:将b[p]更新为a[i]。
c.append([p, a[i]]):记录当前元素的位置和值。
(四)排序与分组部分
Python复制
# 按照第二个元素排序
array = sorted(c, key=lambda x: x[0])
# 初始化一个字典用于存储分类后的数据
data_dict = {}
# 遍历排序后的数组
# 遍历数组,根据第一个元素进行分组
for item in array:
key = item[0] + 1 # 将第一个元素加1作为字典的键
value = item[1] # 第二个元素作为值
if key in data_dict:
data_dict[key].append(value)
else:
data_dict[key] = [value]
# 按照指定的格式输出
print(k)
for key, values in data_dict.items():
print(f"{key}:{' '.join(map(str, values))}")
print(k):输出最长递增子序列的长度。
for key, values in data_dict.items()::遍历字典data_dict。print(f"{key}:{' '.join(map(str, values))}"):按照指定的格式输出每个位置上的元素。其中,map(str, values)将值列表中的每个元素转换为字符串,' '.join(...)将这些字符串用空格连接起来。
完整代码
python复制代码
n=int(input())
a=[int(i) for i in input().split()]
b=[0]*1010
k=0
c=[]
for i in range(n):
p = -1
for j in range(k):
if a[i]<=b[j]:
p=j
break
if (p == -1):
b[k] = a[i]
c.append([k,a[i]])
k += 1
else:
b[p] = a[i]
c.append([p,a[i]])
# 按照第二个元素排序
array = sorted(c, key=lambda x: x[0])
# 初始化一个字典用于存储分类后的数据
data_dict = {}
# 遍历排序后的数组
# 遍历数组,根据第一个元素进行分组
for item in array:
key = item[0] + 1 # 将第一个元素加1作为字典的键
value = item[1] # 第二个元素作为值
if key in data_dict:
data_dict[key].append(value)
else:
data_dict[key] = [value]
# 按照指定的格式输出
print(k)
for key, values in data_dict.items():
print(f"{key}:{' '.join(map(str, values))}")