最长单调自增子序列:给定一个长度为N的数组,找出一个最长的单调自增子序列,输出最长单调自增子序列的长度(不一定连续,但是顺序不能乱)。用c语言写
时间: 2024-10-20 11:05:11 浏览: 27
最长单调递增子序列是一个经典的计算机科学问题,通常采用动态规划算法来解决。在C语言中,我们可以创建一个数组dp,其中dp[i]表示以第i个元素结尾的最长单调递增子序列的长度。下面是基本的解决方案:
```c
#include <stdio.h>
int lengthOfLIS(int arr[], int n) {
if (n == 0) return 0; // 空数组的情况
int dp[n];
dp[0] = 1; // 第一个元素本身就是单个元素的递增子序列
for (int i = 1; i < n; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if (arr[i] > arr[j]) && dp[i] < dp[j] + 1) {
dp[i] = dp[j] + 1;
}
}
}
// 找到全局最大值即为最长递增子序列的长度
int max_len = 0;
for (int i = 0; i < n; i++) {
if (dp[i] > max_len) {
max_len = dp[i];
}
}
return max_len;
}
// 主函数示例
int main() {
int arr[] = {10, 9, 2, 5, 3, 7, 101, 18};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Length of the longest increasing subsequence is %d\n", lengthOfLIS(arr, n));
return 0;
}
```
在这个代码中,`lengthOfLIS`函数计算并返回输入数组arr中最长单调递增子序列的长度。内部有两个嵌套循环,外层遍历每个元素,内层查找是否有更短的递增子序列可以延长。最后,通过遍历dp数组找到最大的值作为结果。
阅读全文