给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(19,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。用C语言实现
时间: 2023-10-03 13:10:24 浏览: 122
C语言实现最长递增子序列问题的解决方法
以下是一种基于动态规划的解法,时间复杂度为O(n):
```c
#include <stdio.h>
#define MAX_N 100
int main() {
int n, a[MAX_N];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int dp[MAX_N], pre[MAX_N];
int max_len = 0, max_last_idx = -1;
for (int i = 0; i < n; i++) {
dp[i] = 1;
pre[i] = -1;
for (int j = 0; j < i; j++) {
if (a[j] < a[i] && dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
pre[i] = j;
}
}
if (dp[i] > max_len) {
max_len = dp[i];
max_last_idx = i;
}
}
int ans[MAX_N], ans_len = 0;
while (max_last_idx != -1) {
ans[ans_len++] = a[max_last_idx];
max_last_idx = pre[max_last_idx];
}
printf("最长递增子序列为:");
for (int i = ans_len - 1; i >= 0; i--) {
printf("%d ", ans[i]);
}
printf("\n");
return 0;
}
```
算法思路:
使用一个数组 `dp` 记录以每个位置为结尾的最长递增子序列的长度,同时使用一个数组 `pre` 记录每个位置的前驱,方便后面回溯出最长递增子序列。
对于每个位置 `i`,遍历其之前的位置 `j`,如果 `a[j] < a[i]` 并且 `dp[j] + 1 > dp[i]`,则更新 `dp[i]` 和 `pre[i]`。
最后遍历一遍 `dp`,找出最长递增子序列的长度 `max_len` 和其结尾位置 `max_last_idx`,然后从 `max_last_idx` 开始使用 `pre` 回溯出最长递增子序列。
阅读全文