Stock Exchange(LIS最长上升子序列问题)
2015-08-15 16:44
405 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/E
题意:
输入L,再输入长为L的序列,找出最长上升子序列的长度。注意选出的上升子序列中相邻元素不能相等。
案例:
input
6
5 2 1 4 5 3
3
1 1 1
4
4 3 2 1
output
3
1
1
思路分析:
找出比前一个数大的数存入数组,如果小于放到前面,替换比它大一点的数,直到找出最长子序列,输出maxn。
源代码如下:
题意:
输入L,再输入长为L的序列,找出最长上升子序列的长度。注意选出的上升子序列中相邻元素不能相等。
案例:
input
6
5 2 1 4 5 3
3
1 1 1
4
4 3 2 1
output
3
1
1
思路分析:
找出比前一个数大的数存入数组,如果小于放到前面,替换比它大一点的数,直到找出最长子序列,输出maxn。
源代码如下:
#include<iostream> #include<cstdio> #define MAX 100005 using namespace std; int main() { int L,i,a,d[MAX],maxn; while(scanf("%d",&L)!=EOF) { maxn=0; d[0]=-1; for(i=0;i<L;i++) { scanf("%d",&a); if(a>d[maxn]) d[++maxn]=a; //储存 else { int x=1,y=maxn,mid; while(x<=y) //替换 { mid=(x+y)>>1; if(a>d[mid]) x=mid+1; else y=mid-1; } d[x]=a; } } printf("%d\n",maxn); } return 0; }
相关文章推荐
- 配置android studio环境
- Unity 3D学习笔记(二)—— 脚本01
- 百度技术沙龙之2013-2&3
- 获取通讯录
- Ubuntu安装Qt及QT Creator
- poj 2112 网络流+二分
- POJ 2485 Highways
- Mysql蠕虫复制
- angular-utils-pagination 使用案例
- Glib多线程编程
- 建立链表和打印链表简单代码
- iOS 委托和协议
- Codeforces 570D Tree Requests
- Hibernate持久化对象的三个状态
- 2016 C语言面试题——字符串函数的实现
- phpmailer 实现发送邮件
- .Net大文件上传(转--待验证)
- 页面的切换效果
- Android Studio 的下载及安装
- 懒人版黑苹果 Yosemite Install(14E46).cdr 安装教程