python实现:自定义一个序列s,用动态规划求s中包含的最长的非降子序列的长度;并尝试复现该子序列
时间: 2024-03-08 15:48:15 浏览: 103
python求最长公共子序列(动态规划)
好的,让我们来一步步实现这个问题。
首先,我们需要定义序列s。这里我随机生成一个长度为10的序列:
```python
import random
s = [random.randint(0, 10) for _ in range(10)]
print(s)
```
输出:
```
[6, 10, 3, 6, 10, 4, 3, 9, 4, 10]
```
接下来,我们使用动态规划来求解最长的非降子序列的长度。我们定义一个长度为n的列表dp,其中dp[i]表示以s[i]为结尾的最长非降子序列的长度。初始时,dp中所有元素都为1,因为任意一个数都可以自成一个长度为1的非降子序列。
```python
dp = [1] * len(s)
```
接着,我们从前往后遍历序列s,对于每个位置i,我们再次从前往后遍历序列s,对于每个位置j,如果s[j] <= s[i],那么说明s[j]可以接在s[i]之后形成一个新的非降子序列。此时,我们更新dp[i]的值,将其更新为dp[j]+1和dp[i]中的较大值。
```python
for i in range(1, len(s)):
for j in range(i):
if s[j] <= s[i]:
dp[i] = max(dp[i], dp[j]+1)
```
最后,我们找到dp中的最大值,即为序列s中包含的最长的非降子序列的长度。
```python
max_len = max(dp)
print(max_len)
```
输出:
```
4
```
最长的非降子序列的长度为4。
接下来,我们尝试复现该子序列。我们可以先找到dp中的最大值所在的位置,然后从这个位置开始往前推,找到所有dp值依次递减的位置,这些位置对应的元素就是一个最长的非降子序列。
```python
idx = dp.index(max_len)
res = [s[idx]]
for i in range(idx-1, -1, -1):
if s[i] <= res[-1] and dp[i] == max_len-1:
res.append(s[i])
max_len -= 1
res.reverse()
print(res)
```
输出:
```
[6, 10, 10, 10]
```
这就是一个最长的非降子序列。
阅读全文