CDOJ-----最长上升子序列
来源:互联网 发布:平价时尚欧美女装知乎 编辑:程序博客网 时间:2024/06/16 18:17
G - 最长上升子序列
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
一个数的序列
你的任务,就是对于给定的序列,求出最长最小的上升子序列。所谓最长最小的子序列,是指若有多个最长子序列时,存在一个子序列
Input
有多组测试数据。输入的第一行是整数
Output
对应每组输入,先输出最长最小的上升子序列长度,再输出最长最小的上升子序列,占一行。每个数后应有一个空格,该行不能有其它多余的符号。
Sample Input
17 1 7 3 5 9 4 8
Sample Output
4 1 3 4 8
#include<cstdio>#include<cstring>#define MAXN 1005#include<string>#include<algorithm>using namespace std;int arr[MAXN],ans[MAXN],len;/*二分查找。 注意,这个二分查找是求下界的; (什么是下界?详情见《算法入门经典》 P145)即返回 >= 所查找对象的第一个位置(想想为什么)也可以用STL的lowe_bound二分查找求的下界*/int binary_search(int i){ int left,right,mid; left=0,right=len; while(left<right) { mid = left+(right-left)/2; if(ans[mid]>=arr[i]) right=mid; else left=mid+1; } return left;}int main(){ int T,p,i,j,k; scanf("%d",&T); while(T--) { scanf("%d",&p); for(i=1; i<=p; ++i) scanf("%d",&arr[i]); ans[1] = arr[1]; len=1; int pos; int maxx=0; for(i=1; i<=p; ++i) { if(arr[i]>ans[len]) ans[++len]=arr[i]; else { int pos=binary_search(i); //stl的做法:pos=lower_bound(ans,ans+len,arr[i])-ans; //printf("pos=%d ",pos); ans[pos] = arr[i]; } if(maxx<len) maxx=len; } printf("%d ",maxx); for(i=1;i<=len;i++) printf("%d ",ans[i]); } return 0;}
- CDOJ-----最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- 最长上升子序列
- Windows API的时间结构体、时间转换及时间获取
- 获取iOS任意线程调用堆栈(一)获取任意线程的调用栈地址列表
- mac下scrapy的安装
- Hibernate Lazy机制
- ztree显示
- CDOJ-----最长上升子序列
- Android与MVC设计模式
- 选择排序
- Win32时间类型FILETIME/SYSTEMTIME/WINDOWSTIME(FILETIME这个名字很奇怪,其实他跟FILE并没有直接关系,只是很多File的API中,都以这个为时间的类型)
- linux\windows上mongodb的安装与配置,以及开启php扩展
- 获取iOS任意线程调用堆栈(二)符号化理论:Mach-o文件结构
- Android中Canvas绘图之PorterDuffXfermode使用及工作原理详解
- 蚂蚁金服成立科学智囊团,机器学习之父Michael I.Jordan担任主席
- PHP PSR-1 规范