hdu 1950 最长上升子序列(lis) nlogn算法【dp】
这个博客说的已经很好了。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】的更多相关文章
- AT2827 最长上升子序列LIS(nlogn的DP优化)
题意翻译 给定一长度为n的数列,请在不改变原数列顺序的前提下,从中随机的取出一定数量的整数,并使这些整数构成单调上升序列. 输出这类单调上升序列的最大长度. 数据范围:1<=n<=10 ...
- hdu 5773 最长递增子序列 (nlogn)+贪心
The All-purpose Zero Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- hdu 1950 最长上升子序列
//Accepted 3540 KB 62 ms //dp 最长上升子序列 #include <cstdio> #include <cstring> #include < ...
- 最长上升子序列 LIS nlogn
给出一个 1 ∼ n (n ≤ 10^5) 的排列 P 求其最长上升子序列长度 Input 第一行一个正整数n,表示序列中整数个数: 第二行是空格隔开的n个整数组成的序列. Output 最长上升子序 ...
- (转载)最长递增子序列 O(NlogN)算法
原博文:传送门 最长递增子序列(Longest Increasing Subsequence) 下面我们简记为 LIS. 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则 ...
- 最长递增子序列 O(NlogN)算法
转自:点击打开链接 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS. 排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个 ...
- 最长上升子序列O(nlogn)算法详解
最长上升子序列 时间限制: 10 Sec 内存限制:128 MB 题目描述 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.我们想知道此时最长上升子 ...
- nlogn 求最长上升子序列 LIS
最近在做单调队列,发现了最长上升子序列O(nlogn)的求法也有利用单调队列的思想. 最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]& ...
- 最长上升子序列 LIS(Longest Increasing Subsequence)
引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…< ...
随机推荐
- 斐波那契字符串_KMP
前言:通过这道题恶补了一下字符串匹配的知识 思路:首先就是求出菲波那切字符串,这个很简单,但是要注意递归超时的问题,可以考虑加上备忘录,或者用递推法,接下来就是匹配问题了,常规的BF会超时,所以要用K ...
- 前端(Node.js)(2)-- Node.js开发环境配置
1.开发环境介绍 1.MEAN Stack 什么是全栈? 负责界面和UI的设计师.负责移动端应用开发的安卓IOS开发工程师.负责服务器端开发的后端程序员.负责数据库开发和管理的数据库工程师.负责服务器 ...
- MAC+iTerm定制目录显示颜色和提示符
知道该如何定制ls时各种类型文件(unix下所有的都是file..)的颜色了. 很简单,就是在.bash_profile下加了三行. export CLICOLOR=1 export LSCOLORS ...
- 2019.9.29 csp-s模拟测试55 反思总结
不咕咕咕是一种美德[大雾] 头一次体会到爆肝写题解??? 这次考试我们没赶上,是后来掐着时间每个人自己考的.我最后的分数能拿到152…熟悉的一题AC两题爆炸. 强烈吐槽出题人起名走心 T1联: 发现每 ...
- ACM-ICPC 2019 西安邀请赛 D.Miku and Generals(二分图+可行性背包)
“Miku is matchless in the world!” As everyone knows, Nakano Miku is interested in Japanese generals, ...
- SourceTree windows免注册免登陆使用方法
问题描述: 安装SourceTree后,首次使用时,需要登录账号:但我们在注册或登录时,可能根本无法打开网页,导致不能进入. 如下截图: 解决方法: 在目录C:\Users\XXXXX\AppData ...
- jquery tooltip.js
1.引用关联的js脚本 <script type="text/javascript" src="script/jquery-1.3.2.min.js"&g ...
- 【Python之路22】冒泡排序算法
1.变量互换 a = 123 b = 456 temp = a a = b b = temp python比较简单的变量互换: a = 123 b = 456 a,b = b,a print(a,b) ...
- Linux下安装配置git
参考博客: https://www.cnblogs.com/luhouxiang/p/5801853.html但执行git --version命令会出现 git version 1.8.3.1 不是最 ...
- 【django后端分离】Django Rest Framework之一般配置(简单剖析)
1:常设状态码 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent). 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成 ...