博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最长上升子序列
阅读量:5294 次
发布时间:2019-06-14

本文共 1230 字,大约阅读时间需要 4 分钟。

Sample Input

8

5 2 8 6 3 6 9 7

Sample Output

4

2 3 6 7

要求找出最长的上升子序列,然后输入子序列。

1 #include
2 using namespace std; 3 4 int main() 5 { 6 ios_base::sync_with_stdio(0); cin.tie(0); 7 int n; 8 int a[3006],b[3006],out[3006]; 9 while(cin>>n){10 memset( a, 0, sizeof a);11 memset( b, 0, sizeof b);12 memset( out, 0, sizeof out);13 14 for(int i=1;i<=n;i++)15 cin >> a[i];16 int len=0,mid=0,o1=0;17 for(int i=n;i>=0;i--){18 for(int j=i+1;j<=n;j++){19 if(a[j]>a[i]){20 if(b[i]
a[j])){ 21 ///自顶向下进行比较22 b[i]=b[j]+1;23 out[i]=j; ///out为数组链表24 }25 }26 }27 }28 29 cout << b[0] << endl;30 for(int i=out[0];i!=0;i=out[i]) ///回溯输出链表31 cout << a[i] << " " ;32 cout << endl;33 }34 return 0;35 }

因为这是要输出最长上升子序列的一个最优,所以要用两个循环遍历。

 

如果不需要输出最优的个子序列,那么有O(nlogn)的时间复杂度的算法。

用一个栈加二分搜索,就可以的出最长上升子序列的长度。

 

关于各种背包问题,三角问题,最大字段和,最大子矩阵和,最长上升子序列等等都是经典的dp入门问题。接下来会进一步加深的学习dp。

 

转载于:https://www.cnblogs.com/ZQUACM-875180305/p/9042820.html

你可能感兴趣的文章
论文笔记——MobileNets(Efficient Convolutional Neural Networks for Mobile Vision Applications)
查看>>
从今天开始
查看>>
Attribute(特性)与AOP
查看>>
第三次作业
查看>>
Codeforces 962 /2错误 相间位置排列 堆模拟 X轴距离最小值 前向星点双连通分量求只存在在一个简单环中的边...
查看>>
Matrix快速幂 模板
查看>>
MySQL开启远程连接权限
查看>>
tomcat7.0.27的bio,nio.apr高级运行模式
查看>>
C#预处理器命令
查看>>
苹果手表:大方向和谷歌一样,硬件分道扬镳
查看>>
Competing Consumers Pattern (竞争消费者模式)
查看>>
HDUOJ ------1398
查看>>
cf--------(div1)1A. Theatre Square
查看>>
Android面试收集录15 Android Bitmap压缩策略
查看>>
PHP魔术方法之__call与__callStatic方法
查看>>
ubuntu 安装后的配置
查看>>
Html学习_简易个人网页制作
查看>>
angular中ng-bind指令小案例
查看>>
jqery总结
查看>>
Lodop获取客户端主网卡ip地址是0.0.0.0
查看>>