1259:【例9.3】求最长不下降序列
# 题目描述
设有由
例如13,7,9,16,38,24,37,18,44,19,21,22,63,15。例中13,16,18,19,21,22,63就是一个长度为7的不下降序列,同时也有7 ,9,16,18,19,21,22,63组成的长度为8的不下降序列。
# 输入
第一行为n,第二行为用空格隔开的n个整数。
# 输出
第一行为输出最大个数max(形式见样例);
第二行为max个整数形成的不下降序列,答案可能不唯一,输出一种就可以了,本题进行特殊评测。
# 样例
# 输入样例
14
13 7 9 16 38 24 37 18 44 19 21 22 63 15
1
2
2
# 输出样例
max=8
1
# 源代码
#include <cstdio>
#include <iostream>
using namespace std;
#define M 1000
int f[M], a[M], n, t = 0;
int ans, ans_num, nextn[M], ans_xu[M];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]), f[i] = 1;
for (int i = 2; i <= n; i++)
for (int j = 1; j < i; j++)
if (a[i] >= a[j]) { //坑点
if (f[j] + 1 > f[i]) {
f[i] = f[j] + 1;
nextn[i] = j;
}
}
for (int i = 1; i <= n; i++) {
if (f[i] > ans) {
ans = f[i];
ans_num = i;
}
}
printf("max=%d\n", ans);
while (ans_num) {
ans_xu[++t] = a[ans_num];
ans_num = nextn[ans_num];
}
for (int i = t; i >= 1; i--) printf("%d ", ans_xu[i]);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
上次更新: 2022/03/08, 01:01:22