设计一个算法,计算由n个整数组成的序列的最长单调递增子序列的长度。输入形式;两行。 第1行为一个正整数n,表示整数的个数,n≤1000。 第2行为n个整数 c语言
时间: 2024-02-17 18:01:37 浏览: 273
C语言程序设计-计算并输出给定整数n的所有因子之和(不包括1与自身);注意:n的值不大于1000.c
5星 · 资源好评率100%
您好,这是一个经典的动态规划问题,以下是一个简单的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 1000
int main() {
int n;
int a[MAX_N];
int dp[MAX_N];
// 读入序列
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
// 动态规划求解
for (int i = 0; i < n; ++i) {
dp[i] = 1;
for (int j = 0; j < i; ++j) {
if (a[j] < a[i] && dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
}
}
}
// 找到最长的递增子序列长度
int ans = 0;
for (int i = 0; i < n; ++i) {
if (dp[i] > ans) {
ans = dp[i];
}
}
printf("%d\n", ans);
return 0;
}
```
该算法的时间复杂度为$O(n^2)$,可以通过使用二分法优化到$O(nlogn)$。
阅读全文