最长单调递增子序列O(nlogn)
2015-11-17 14:39
190 查看
#include "iostream" #include "fstream" using namespace std; /* b[k]表示长度为i的子序列c[i]中,长度为k的最长单调递增子序列的最小结尾元素值 当c[i]>=b[k], k = k + 1; b[k] = c[i] 否则,将c[i]放置到b[]中适当位置 */ int b[100]; int c[100]; //二分搜索法在b[1,k]中找到下标h,使得b[h-1]<=c[i]<=b[h] int binary(int i, int k) { int l, h; if(c[i] < b[1]) return 1; for(l=1, h=k; l!=h-1;) { if(b[k=(l+h)/2] <= c[i]) l = k; else h = k; } return h; } int increase(int n) { int i = 1, k; b[1] = c[1]; for(i=2, k=1; i<=n; i++) if(c[i] >= b[k]) b[++k] = c[i]; else b[binary(i, k)] = c[i]; return k; } int main() { int n; cout << "输入序列长度:" ; cin >> n; cout << "输入子序列:"; for(int i=1; i<=n; i++) cin >> c[i]; int count = increase(n); cout << "最长单调递增子序列为:" << count << endl; return 0; }
相关文章推荐
- 学习okhttp wiki--HTTPS
- 为sourceinsight添加makefile、kconfig、*.S文件支持
- 在Windows下搭建React Native Android开发环境[踩坑]
- C#连接、访问MySQL数据库
- iOS中UIScrollView和UIPageControl以及NSTimer的综合使用
- javaScript语法
- leetcode@ [2/43] Add Two Numbers / Multiply Strings(大整数运算)
- android屏幕适配
- 16 从EventLoop取消注册和重新注册
- js 语法
- ipcs查看消息队列命令
- iOS 8.0 之后相册授权直接跳转到设置
- data-*的定义和用法
- 如何为ABAP程序添加权限检查
- 制作一个类似登录界面的窗体(无最大最小化栏)
- 11.2 非模态对话框
- ORA-12519: TNS:no appropriate service handler found 解决
- Linux 下Oracle 手工create database 脚本和步骤
- 292 Nim Game
- OC字符串的常规用法NSString的操作