编程求出数列的所有升或降的最大子序列
时间: 2023-04-24 09:03:19 浏览: 184
这是一个经典的问题,可以使用动态规划来解决。具体步骤如下:
1. 定义状态:设dp[i]表示以第i个数结尾的最长升序子序列的长度(或最长降序子序列的长度)。
2. 状态转移方程:对于每个i,我们需要遍历前面的所有数j(j<i),如果a[j]<a[i](或a[j]>a[i]),则dp[i]=max(dp[i],dp[j]+1)。
3. 最终结果:遍历dp数组,找到最大值,即为所求的最长升序子序列的长度(或最长降序子序列的长度)。
需要注意的是,如果题目要求输出最长升序子序列(或最长降序子序列)本身,我们还需要记录每个状态的来源,即dp[i]的值是由哪个dp[j]转移而来的。可以使用一个数组pre来记录,pre[i]表示dp[i]的来源。
代码实现如下:
```python
def longest_subsequence(nums):
n = len(nums)
dp = [1] * n
pre = [-1] * n
for i in range(1, n):
for j in range(i):
if nums[j] < nums[i]:
if dp[j] + 1 > dp[i]:
dp[i] = dp[j] + 1
pre[i] = j
elif nums[j] > nums[i]:
if dp[j] + 1 > dp[i]:
dp[i] = dp[j] + 1
pre[i] = j
max_len = max(dp)
idx = dp.index(max_len)
subseq = []
while idx != -1:
subseq.append(nums[idx])
idx = pre[idx]
subseq.reverse()
return subseq
```
其中,nums为输入的数列,subseq为最长升序子序列(或最长降序子序列)。
阅读全文