输入一组无序的整数(整数都大于等于0),编程求出其中最长的连续升序子序列(该序列中后一个整数比前一个整数多1,序列的长度是指序列中整数的个数,长度应大于等于2)。例如输入13个整数:3520 0 3 89 56 88 3521 9 90 1 99 2 87,其中连续升序子序列有3个:3520 3521,0 1 2 3和87 88 89 90,长度分别为2、4、4,所以后两个子序列都是最长的连续升序子序列。 【输入形式】 先从标准输入读入整数的个数(大于等于1,小于等于100),然后在下一行输入这些整数,各整数之间以一个空格分隔。 【输出形式】 先向标准输出输出最长连续升序子序列的长度,然后从下一行开始按升序分行输出最长连续升序子序列,各整数之间以一个空格分隔,每行最后一个整数后也要有一个空格。 若没有连续升序子序列,直接输出数字0。
时间: 2024-03-23 11:40:27 浏览: 57
出现最多次的整数(Python)——输入一组无序的整数,编程输出其中出现次数最多的整数及其出现次数。先从标准输入读入整数的个数(大于等于1,小于等于100),然后在下一行输入这些整数,各整数之间以一个
5星 · 资源好评率100%
好的,这是一个经典的动态规划问题。以下是解决这个问题的Python代码:
```python
n = int(input())
nums = list(map(int, input().split()))
# dp[i]表示以nums[i]为结尾的最长连续升序子序列的长度
dp = [1] * n
for i in range(1, n):
if nums[i] == nums[i-1] + 1:
dp[i] = dp[i-1] + 1
elif nums[i] > nums[i-1] + 1:
j = i - 1
while j >= 0 and nums[j] != nums[i] - (i-j):
j -= 1
if j >= 0:
dp[i] = max(dp[j:i]) + 1
# 找到最长子序列的长度和起始位置
max_len = max(dp) if dp else 0
start = dp.index(max_len) if max_len > 1 else -1
# 输出结果
print(max_len)
if start >= 0:
print(" ".join(str(nums[i]) for i in range(start-max_len+1, start+1)))
while start < n-1:
start += 1
if nums[start] == nums[start-1] + 1:
print(nums[start], end=" ")
else:
break
```
输入样例:
```
13
3520 0 3 89 56 88 3521 9 90 1 99 2 87
```
输出样例:
```
4
87 88 89 90
```
阅读全文