【输入形式】 两行。 第1行为一个正整数n,表示整数的个数,n≤1000。 第2行为n个整数。 【输出形式】 一个整数,为最长单调递增子序列的长度。使用c语言
时间: 2024-02-23 18:01:34 浏览: 220
我们第一行包括两个整数n,k(1<=n<=100,k<=6e5),表示有n个数字,目标和为k 第二行输入n个整数(c1 c2
以下是使用动态规划求解最长单调递增子序列长度的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, i, j, max_len = 1;
scanf("%d", &n);
int* nums = (int*)malloc(n * sizeof(int));
int* dp = (int*)malloc(n * sizeof(int));
for (i = 0; i < n; i++) {
scanf("%d", &nums[i]);
dp[i] = 1;
}
for (i = 1; i < n; i++) {
for (j = 0; j < i; j++) {
if (nums[j] < nums[i] && dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
}
}
if (dp[i] > max_len) {
max_len = dp[i];
}
}
printf("%d\n", max_len);
free(nums);
free(dp);
return 0;
}
```
该程序使用 dp[i] 表示以 nums[i] 结尾的最长单调递增子序列长度,初始值为 1。然后遍历 nums 数组,对于每个 i,枚举 j 从 0 到 i-1,如果 nums[j] < nums[i] 且 dp[j] + 1 大于 dp[i],则更新 dp[i] 的值。最后遍历 dp 数组,找出最大值即为最长单调递增子序列长度。
阅读全文