Python 动态规划求最长递增子序列长度
Python 动态规划求最长递增子序列长度
给定一个整数序列,找到其中最长严格递增子序列的长度。
动态规划表:
| | 2 | 5 | 3 | 4 | 7 | 6 | | - | - | - | - | - | - | - | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | | 2 | 1 | 2 | 1 | 2 | 3 | 2 | | 3 | 1 | 2 | 2 | 2 | 3 | 2 | | 4 | 1 | 2 | 2 | 3 | 4 | 3 | | 5 | 1 | 2 | 2 | 3 | 4 | 3 | | 6 | 1 | 2 | 2 | 3 | 4 | 4 |
最长递增子序列的长度为 4。
代码:
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)
print('动态规划表:')
for i in range(n):
print(dp[i], end=' ')
print('\n')
return max(dp)
nums = [2, 5, 3, 4, 7, 6]
print('最长递增子序列的长度为:', longest_increasing_subsequence(nums))
解释:
dp[i]表示以nums[i]结尾的最长递增子序列的长度。- 初始化
dp为全 1,因为每个元素自身都是一个长度为 1 的递增子序列。 - 遍历
nums,对于每个i,遍历0到i-1,如果nums[j] < nums[i],则dp[i]可以取dp[j] + 1,表示在nums[j]结尾的最长递增子序列后面加上nums[i],得到一个新的更长的递增子序列。 - 最后,
max(dp)就是最长递增子序列的长度。
总结:
使用动态规划算法可以有效地求解最长递增子序列问题。通过构建一个动态规划表,我们可以记录每个位置结尾的最长递增子序列长度,并最终求出最长递增子序列的长度。
原文地址: https://www.cveoy.top/t/topic/n9zi 著作权归作者所有。请勿转载和采集!