这个博客说的已经很好了。http://blog.csdn.net/shuangde800/article/details/7474903

简单记录一下自己学的:

问题就是求一个数列最长上升子序列的长度。

如果子序列长度相同,那么末尾小的子序列更有可能成为最长的子序列。所以就用一个l数组存当子序列长度为len时最小的末尾元素。如果序列下一个值比l[len]大,说明上升子序列长度增加,那么l[len++]=a[i];如果是小,就想办法把它插入到了l数组中....

HDU 1950 说白了就是求lis:

 #include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
int a[maxn],l[maxn];
int len,n; int lis()
{
len=;
l[]=a[];
for (int i=;i<n;i++){
if(a[i]>l[len-])
l[len++]=a[i];
else
*lower_bound(l,l+len,a[i])=a[i];
}
return len;
} int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n;
for (int i=;i<n;i++)
cin>>a[i];
cout<<lis()<<endl;
}
return ;
}

这个是二分写法(感觉二分用的最广):

 #include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
int a[maxn],l[maxn];
int len,n; int bin_search(int key)
{
int left, right, mid;
left = , right = len;//应该是数据比较水,这样写是左闭右开区间查找,严格来说应该是right=len+1
while (left<right)
{
mid = (left + right) >> ;
if (l[mid] >= key)
right = mid;
else left = mid + ;
}
return left;
} int lis()
{
len = ;
l[] = a[];
for (int i = ; i <= n; i++) {
if (a[i] > l[len])
l[++len] = a[i];
else {
int pos = bin_search(a[i]);
l[pos] = a[i];
}
}
return len;
} int main()
{
int T;
cin >> T;
while (T--)
{
cin >> n;
for (int i = ; i <= n; i++)
cin >> a[i];
cout << lis() << endl;
}
return ;
}

二分也可以这样写 (查找第一个大于或等于key的元素):

 int bin_search(int key)
{
while(left<=right)
{
mid=(left+right)>>;
if(l[mid]>=key)
right=mid-;
else left=mid+;
}
return left;
}

还有一种是用stl里的set写,原理和上面一样,感觉用的好精妙:

 #include<iostream>
#include<algorithm>
#include<set>
using namespace std;
const int MAXN = ;
set<int> st;
set<int>::iterator it;
int a[MAXN]; int main()
{
int T, n;
cin >> T;
while (T--)
{
st.clear();
cin >> n;
for (int i = ; i <= n; i++) {
cin >> a[i];
if (st.count(a[i])) continue;
st.insert(a[i]);
it = st.find(a[i]);
it++;
if (it != st.end())
st.erase(it);
}
cout << st.size() << endl;
}
return ;
}

当然,还有更精妙的:

 #include<iostream>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = ;
int a[N],dp[N]; int main()
{
int T, n;
cin >> T;
while (T--)
{
cin >> n;
for (int i = ; i < n; i++) {
cin >> a[i]; dp[i] = INF;
}
for (int i = ; i < n; i++)
*lower_bound(dp, dp + n, a[i]) = a[i];
cout << lower_bound(dp, dp + n, INF) - dp << endl;
}
return ;
}

hdu 1950 最长上升子序列(lis) nlogn算法【dp】的更多相关文章

  1. AT2827 最长上升子序列LIS(nlogn的DP优化)

      题意翻译 给定一长度为n的数列,请在不改变原数列顺序的前提下,从中随机的取出一定数量的整数,并使这些整数构成单调上升序列. 输出这类单调上升序列的最大长度. 数据范围:1<=n<=10 ...

  2. hdu 5773 最长递增子序列 (nlogn)+贪心

    The All-purpose Zero Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  3. hdu 1950 最长上升子序列

    //Accepted 3540 KB 62 ms //dp 最长上升子序列 #include <cstdio> #include <cstring> #include < ...

  4. 最长上升子序列 LIS nlogn

    给出一个 1 ∼ n (n ≤ 10^5) 的排列 P 求其最长上升子序列长度 Input 第一行一个正整数n,表示序列中整数个数: 第二行是空格隔开的n个整数组成的序列. Output 最长上升子序 ...

  5. (转载)最长递增子序列 O(NlogN)算法

    原博文:传送门 最长递增子序列(Longest Increasing Subsequence) 下面我们简记为 LIS. 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则 ...

  6. 最长递增子序列 O(NlogN)算法

    转自:点击打开链接 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS. 排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个 ...

  7. 最长上升子序列O(nlogn)算法详解

    最长上升子序列 时间限制: 10 Sec   内存限制:128 MB 题目描述 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.我们想知道此时最长上升子 ...

  8. nlogn 求最长上升子序列 LIS

    最近在做单调队列,发现了最长上升子序列O(nlogn)的求法也有利用单调队列的思想. 最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]& ...

  9. 最长上升子序列 LIS(Longest Increasing Subsequence)

    引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…< ...

随机推荐

  1. Redis源码解析:15Resis主从复制之从节点流程

    Redis的主从复制功能,可以实现Redis实例的高可用,避免单个Redis 服务器的单点故障,并且可以实现负载均衡. 一:主从复制过程 Redis的复制功能分为同步(sync)和命令传播(comma ...

  2. TZ_01MyBatis_SqlMapConfig.xml

    1.sqlMapConfig的配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE conf ...

  3. memcache缓存使用详解

    初始化一个Memcache的对象:$mem = new Memcache(); 连接到我们的Memcache服务器端,第一个参数是服务器的IP地址,也可以是主机名,第二个参数是Memcache的开放的 ...

  4. 锋利的JQuery学习之JQuery中的事件

    一.加载DOM 在页面加载完毕之后,浏览器会通过javascript为dom元素添加事件,在常规的javascript中使用window.onload方法,而在jQuery中使用的是$(documen ...

  5. day38 09-Spring类的完整生命周期及后处理Bean

    可以配置Bean的这个类的初始化和销毁的方法. 如何销毁这个bean?销毁必须得手动地关闭掉容器才行.而且销毁必须是在scope="singleton"下才有效.因为如果你scop ...

  6. 有趣的HTML5 Web SQL 数据库

    Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs. 核心方法 以下是规范中定义的三个核心方法: openD ...

  7. vue里调用moment.js

    1.首先安装moment npm install moment --save 2.在main.js里引入 import moment from 'moment'//导入文件      Vue.prot ...

  8. spring源码学习之默认标签的解析(二)

    这个是接着上一篇来写,主要是这章内容比较多,还是分开来写吧! 一.AbstractBeanDefinition属性介绍 XML中的所有的属性都可以在GenericBeanDefinition中找到对应 ...

  9. Django项目:CRM(客户关系管理系统)--14--06PerfectCRM实现King_admin注册功能获取内存优化处理

    <th >{% get_app_name admin_class.model %}{{ admin_class }} </th> #kingadmin_tags.py # —— ...

  10. JavaScript的注意事项

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...