在程序中添加函数 trace_back(),尝试通过动态规划表回溯得到原问题的解。从动态规划表中获得最长递增子序列长度 查找该值的出现位置 输出从该值往前的最长递增子序列长度个元素作为原问题解返回
时间: 2024-02-26 16:58:44 浏览: 64
以下是Python实现最长递增子序列并回溯得到原问题解的代码:
```python
def longest_increasing_subsequence(A):
n = len(A)
dp = [1] * n
pre = [-1] * n
for i in range(1, n):
for j in range(i):
if A[j] < A[i] and dp[j] + 1 > dp[i]:
dp[i] = dp[j] + 1
pre[i] = j
max_len = max(dp)
index = dp.index(max_len)
res = [A[index]]
while pre[index] != -1:
index = pre[index]
res.append(A[index])
res.reverse()
return max_len, res
A = [18, 17, 19, 6, 11, 21, 23, 15]
max_len, res = longest_increasing_subsequence(A)
print("最长递增子序列长度为:", max_len)
print("最长递增子序列为:", res)
```
函数`longest_increasing_subsequence`返回最长递增子序列的长度和最长递增子序列。在函数中,我们新增了一个数组`pre`用于记录每个元素在最长递增子序列中的前一个元素的下标。在求解完dp数组之后,我们可以通过回溯pre数组来得到原问题的解。
首先,我们找到最长递增子序列的最后一个元素的下标index,然后从后往前遍历pre数组,找到每个元素在最长递增子序列中的前一个元素的下标,把这个元素添加到结果数组中。最后,把结果数组翻转过来,就得到了最长递增子序列。
时间复杂度同样为O(n^2)。
阅读全文