1259:【例9.3】求最长不下降序列 2021-01-15

简介: 1259:【例9.3】求最长不下降序列 2021-01-15

1259:【例9.3】求最长不下降序列

时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

设有由n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)若存在i1<i2<i3<…<ie 且有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就是一个长度为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

【输出样例】

max=8

7 9 16 18 19 21 22 63

1. #include <stdlib.h>
2. #include <cstdio>
3. #include <algorithm>
4. #include <iostream>
5. using namespace std;
6. const int M=205;
7. int a[M][4],n,maxn=0,t;
8. int main()
9. {
10.   scanf("%d",&n);
11.   for(int i=1;i<=n;i++){
12.     scanf("%d",&a[i][1]);//原数
13.     a[i][2]=1;//存储最大长度
14.     a[i][3]=0;//记录路径 上一个位置
15.   }
16.   for(int i=n-1;i>=1;i--){
17.     int l=0,p=0;
18.     for(int j=i+1;j<=n;j++)
19.       if(a[i][1]<=a[j][1]&&a[j][2]>l){
20.         l=a[j][2];p=j;
21.       }
22.     if(l>0){
23.       a[i][2]+=l;a[i][3]=p;
24.     }
25.   }
26.   for(int i=1;i<=n;i++){
27.     if(a[i][2]>maxn){
28.       maxn=a[i][2];
29.       t=i;
30.     }
31.   }
32.   printf("max=%d\n",maxn);
33.   while(t!=0){
34.     printf("%d ",a[t][1]);
35.     t=a[t][3];
36.   }
37.   return 0;
38. }

 

相关文章
算法修炼Day52|● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组
算法修炼Day52|● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组
|
3月前
|
算法
674.最长连续递增序列、5. 最长回文子串(2021-11-05)
674.最长连续递增序列、5. 最长回文子串(2021-11-05)
25 0
|
8月前
最长连续不重复子序列
最长连续不重复子序列
42 1
|
8月前
|
C++
最长特殊序列 Ⅰ(C++)
最长特殊序列 Ⅰ(C++)
37 0
|
8月前
leetcode-1438:绝对差不超过限制的最长连续子数组
leetcode-1438:绝对差不超过限制的最长连续子数组
53 0
|
8月前
|
算法
leetcode-128:最长连续序列
leetcode-128:最长连续序列
56 0
|
8月前
leetcode-674:最长连续递增序列
leetcode-674:最长连续递增序列
56 0
m 序列(最长线性反馈移位寄存器序列)详解
m 序列(最长线性反馈移位寄存器序列)详解
617 0
线性DP:最长上升(下降)子序列
线性DP:最长上升(下降)子序列
51 0
|
存储 算法
LeetCode 128. 最长连续序列
LeetCode 128. 最长连续序列
123 0