求一个序列的最长上升子序列。代码
时间: 2024-06-03 16:09:19 浏览: 66
可以使用动态规划来解决这个问题。我们定义 dp[i] 为以第 i 个数结尾的最长上升子序列的长度,那么可以得到状态转移方程:
dp[i] = max(dp[j] + 1),其中 j < i 且 nums[j] < nums[i]
最终的答案就是 dp 数组中的最大值。下面是代码实现:
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n, 1);
int ans = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
ans = max(ans, dp[i]);
}
return ans;
}
相关问题
求一个序列的最长上升子序列。
可以使用动态规划来解决这个问题。我们定义一个数组 dp,其中 dp[i] 表示以第 i 个元素为结尾的最长上升子序列的长度。初始时,dp 数组中的所有元素均为 1,因为每个元素本身都可以构成长度为 1 的上升子序列。
接下来,我们从前往后遍历序列,对于每个元素 nums[i],我们从它之前的所有元素 nums[j] 中找出小于它的元素,并且在它们对应的 dp 值中选取最大的那个,然后将 dp[i] 的值设为该最大值加 1,即:
dp[i] = max(dp[j] + 1),其中 0 <= j < i 且 nums[j] < nums[i]
最后,我们遍历 dp 数组,找出其中最大的值,即为最长上升子序列的长度。
以下是一个 Python 代码示例:
def lengthOfLIS(nums):
n = len(nums)
if n == 0:
return 0
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)
最长上升子序列的代码
最长上升子序列是一个经典的计算机科学问题,通常通过动态规划来解决。下面是一个简单的Python代码示例,用于找到给定整数数组中最长的上升子序列:
```python
def longest_increasing_subsequence(nums):
if not nums: return []
# 初始化一个长度为n+1的列表,所有元素初始值都设为1(表示至少有一个元素)
dp = [1] * len(nums)
for i in range(len(nums)):
for j in range(i):
# 如果当前元素小于前一个元素,并且dp[j]+1大于dp[i],说明找到了更长的上升子序列
if nums[i] > nums[j] and dp[j] + 1 > dp[i]:
dp[i] = dp[j] + 1
# 找到最大值并返回对应的索引,即最长上升子序列的长度
max_length = max(dp)
index = dp.index(max_length)
# 从nums中反向回溯构建最长上升子序列
lis = [nums[index]]
while index != 0:
index -= 1
if nums[index] < lis[-1] and dp[index] == dp[index - 1] + 1:
lis.append(nums[index])
return lis[::-1] # 返回最长上升子序列
# 使用示例
numbers = [10, 9, 2, 5, 3, 7, 101, 18]
print(longest_increasing_subsequence(numbers)) # 输出:[10, 2, 3, 7, 101]
阅读全文