【题目描述】设有由n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)若存在i1
且有b(i1)<=b(i2)<=…<=b(ie)则称为长度为e的不下降序列。程序要求,当原数列出之后,求出最长的不下降序列。
例如13,7,9,16,38,24,37,18,44,19,21,22,63,15。例中13,16,18,19,21,22,63就是一个长度为77的不下降序列,同时也有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【输出样例】max=8 7 9 16 18 19 21 22 63#includeint main() { int n; scanf("%d", &n); int a[210]; int dp[210]; int c[210]; int maxx = 0; int k; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } for (int i = 1; i <= n; i++) { dp[i] = 1; for (int j = 1; j < i; j++) { if (a[i] >= a[j] && dp[j] + 1 > dp[i]) { dp[i] = dp[j] + 1; } } if (dp[i] > maxx) { maxx = dp[i]; k = i; } } int p = 0, m = maxx, i = k - 1; c[p++] = k; while (m > 1) { if (dp[i] == m - 1 && a[i] <= a[k]) { c[p++] = i; k = i; m--; } i--; } printf("max=%dn", maxx); for (i = p - 1; i >= 0; i--) { printf("%d ", a[c[i]]); } return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)