用c语言设计一个 0(n²)时间的算法,找出由n个数组成的序列的最长单调递增子序列。
时间: 2024-10-10 19:02:50 浏览: 54
C语言实现最长递增子序列问题的解决方法
在C语言中设计一个O(n^2)时间复杂度的算法来找出由n个整数构成的数组的最长单调递增子序列,我们可以使用动态规划(Dynamic Programming)。经典的解决方案是通过维护两个数组,一个是当前最大长度,另一个存储了每个位置的最大值对应的前一个位置。
以下是一个简单的示例:
```c
#include <stdio.h>
int lengthOfLIS(int arr[], int n) {
if (n == 0) return 0;
int dp[n], prev[n];
dp[0] = 1; // 初始化第一个元素的长度为1
prev[0] = -1; // 首个元素前一个位置为-1
for (int i = 1; i < n; ++i) {
dp[i] = 1;
for (int j = 0; j < i; ++j) {
if (arr[j] < arr[i]) {
if (dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
prev[i] = j; // 更新前一个位置
}
}
}
}
int max_len = 0;
int max_index = -1;
for (int i = 0; i < n; ++i) {
if (dp[i] > max_len) {
max_len = dp[i];
max_index = i;
}
}
// 构造最长递增子序列
int* lis = (int*)malloc(max_len * sizeof(int));
while (max_index != -1) {
lis[max_len - 1] = arr[max_index];
max_len--;
max_index = prev[max_index];
}
lis[max_len] = 0; // 添加终止符
printf("Longest Increasing Subsequence: ");
for (int i = max_len - 1; i >= 0; --i) {
printf("%d ", lis[i]);
}
free(lis);
return max_len;
}
int main() {
int arr[] = {10, 9, 2, 5, 3, 7, 101, 18};
int n = sizeof(arr) / sizeof(arr[0]);
lengthOfLIS(arr, n);
return 0;
}
```
这个程序首先计算每个元素可以构成的最长递增子序列长度,然后回溯找到实际的子序列。运行此程序会输出给定数组的最长递增子序列。
阅读全文