两行。 第1行为一个正整数n,表示整数的个数,n≤1000。 第2行为n个整数。 【输出形式】 一个整数,为最长单调递增子序列的长度。
时间: 2024-02-23 20:01:06 浏览: 97
我们第一行包括两个整数n,k(1<=n<=100,k<=6e5),表示有n个数字,目标和为k 第二行输入n个整数(c1 c2
这是一个经典的最长上升子序列问题,可以使用动态规划求解。定义一个长度为n的数组dp,其中dp[i]表示以第i个数为结尾的最长上升子序列的长度。初始时,每个数的最长上升子序列长度都为1,即dp[i]=1。然后依次枚举前面的数,如果该数比当前数小,则更新dp[i]的值为dp[j]+1,其中j为比i小的数中,dp[j]+1最大的那个数的下标。
代码如下:
```python
n = int(input()) # 整数的个数
nums = list(map(int, input().split())) # n个整数
dp = [1] * n # 初始化dp数组,每个数的最长上升子序列长度都为1
for i in range(1, n):
for j in range(i):
if nums[j] < nums[i]:
dp[i] = max(dp[i], dp[j] + 1)
print(max(dp)) # 最长上升子序列的长度为dp数组中的最大值
```
注意,这里的时间复杂度为O(n^2),如果要优化时间复杂度,可以使用二分查找,将时间复杂度降为O(nlogn)。具体做法是维护一个长度为len的数组d,其中d[i]表示长度为i的最长上升子序列的末尾最小的数。初始时,d[1]=nums[0]。然后依次枚举后面的数,如果该数比d[len]大,则将该数添加到d的末尾,并将len加1;否则,在d中二分查找第一个比该数大的位置,将该位置的数替换为该数。最终len即为最长上升子序列的长度。
代码如下:
```python
n = int(input()) # 整数的个数
nums = list(map(int, input().split())) # n个整数
d = [nums[0]] # 初始化d数组,长度为1,末尾为nums[0]
len = 1 # 当前最长上升子序列的长度
for i in range(1, n):
if nums[i] > d[len-1]:
d.append(nums[i])
len += 1
else:
l, r = 0, len-1
while l < r:
mid = (l + r) // 2
if d[mid] < nums[i]:
l = mid + 1
else:
r = mid
d[l] = nums[i]
print(len) # 最长上升子序列的长度即为d数组的长度
```
阅读全文