最长递增子序列python
时间: 2023-10-14 16:29:12 浏览: 62
最长递增子序列(Longest Increasing Subsequence)可以用动态规划算法来解决。下面是一个Python代码示例:
```python
def longest_increasing_subsequence(nums):
n = len(nums)
dp = [1] * n
for i in range(1, n):
for j in range(i):
if nums[j] < nums[i]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
nums = [10, 9, 2, 5, 3, 7, 101, 18]
print(longest_increasing_subsequence(nums))
```
输出结果为4,因为最长递增子序列为[2, 5, 7, 101]。
相关问题
用动态规划算法求解最长递增子序列python完整代码
好的,下面是用动态规划算法求解最长递增子序列的Python完整代码:
```python
def longest_increasing_subsequence(nums):
n = len(nums)
dp = [1] * n
for i in range(1, n):
for j in range(i):
if nums[j] < nums[i]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
# 测试
nums = [10, 9, 2, 5, 3, 7, 101, 18]
print(longest_increasing_subsequence(nums)) # 输出:4
```
其中,`nums`是要求解的序列,`n`是序列的长度,`dp`是一个长度为`n`的列表,`dp[i]`表示以`nums[i]`结尾的最长递增子序列的长度。初始化时,`dp`的所有元素都为1,因为每个元素本身都是一个长度为1的递增子序列。
然后,我们用两个嵌套的循环来遍历所有的元素对`(i, j)`,其中`i`表示当前元素的下标,`j`表示之前的某个元素的下标。如果`nums[j] < nums[i]`,则说明`nums[i]`可以接在以`nums[j]`结尾的递增子序列后面,从而形成一个更长的递增子序列。因此,我们更新`dp[i]`的值为`max(dp[i], dp[j] + 1)`。
最后,返回`dp`中的最大值即可。
把返回最长递增子序列的长度和最长递增子序列的函数分成两个函数写,并且返回最长递增子序列的函数的两个参数分别是原序列和最长递增子序列长度
好的,我可以帮你写这两个函数。下面是返回最长递增子序列的长度的函数:
```python
def get_lis_length(nums):
if not nums:
return 0
n = len(nums)
dp = [1] * n
for i in range(1, n):
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
```
而下面是返回最长递增子序列及其长度的函数:
```python
def get_lis(nums):
if not nums:
return [], 0
n = len(nums)
dp = [[num] for num in nums]
lis = []
for i in range(1, n):
for j in range(i):
if nums[i] > nums[j] and len(dp[i]) < len(dp[j]) + 1:
dp[i] = dp[j] + [nums[i]]
if len(dp[i]) > len(lis):
lis = dp[i]
return lis, len(lis)
```
这里的 `get_lis` 函数除了返回最长递增子序列的长度外,还返回了最长递增子序列本身。同时,由于最长递增子序列可能不止一个,这里在计算最长递增子序列的过程中,记录了当前找到的最长递增子序列。
阅读全文