动态规划-基础篇——最长上升子序列(nlogn)
2014-01-24 20:24
211 查看
我写这片博文就只是提醒自己不要理解而已,其中只是一个结论,其实的证明,思路啥的都没写,以后搞dp专题的时候会全部补上,这里只是一个开头。
对于最长上升子序列(LIS)问题中,一直对lower_bound(),和upper_bound()分不清楚。
用法是:如果是严格LIS,则用的是lower_bound(),
如果是非严格LIS,则用的是upper_bound();
例如对于序列{3,4,4,5,4,4,4,4,4,4,6};
则严格Lis为{3,4,5,6},长度为4
而非严格LIS为{3,4,4,4,4,4,4,6}长度为8
代码如下
对于最长上升子序列(LIS)问题中,一直对lower_bound(),和upper_bound()分不清楚。
用法是:如果是严格LIS,则用的是lower_bound(),
如果是非严格LIS,则用的是upper_bound();
例如对于序列{3,4,4,5,4,4,4,4,4,4,6};
则严格Lis为{3,4,5,6},长度为4
而非严格LIS为{3,4,4,4,4,4,4,6}长度为8
代码如下
#include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> #include <climits> #include <queue> #include <stack> #include <map> #include <vector> #include <algorithm> using namespace std; const int maxn=30000+5; int b[maxn],a[maxn]; int LISdp(int n) { int i,k; b[1]=a[1]; for(i=2,k=1;i<=n;i++) { if(a[i]>=b[k]) b[++k]=a[i]; else { int pos=upper_bound(b+1,b+1+k,a[i])-b;//非严格 b[pos]=a[i]; } } return k; } int main() { //freopen("in.txt","r",stdin); //freopen("out2.txt","w",stdout); int n; while(cin>>n){ for(int i=1;i<=n;i++){ cin>>a[i]; } int ans=LISdp(n); cout<<n-ans<<endl; } return 0; }
相关文章推荐
- 动态规划(DP)之最长上升子序列
- [动态规划]之裸lis之最长上升子序列POJ 2533
- 最长上升子序列问题 nlogn 实现算法的简述
- [动态规划]数字三角形、最长上升子序列
- nuaa1561 Oliver的恋爱 (最长上升子序列O(nlogn))
- 最长上升子序列 O(n^2)算法和O(nlogn)算法
- 动态规划问题(2)-最长上升子序列
- uva 10534(最长上升子序列O(nlogn))
- 动态规划——求最长下降/上升子序列
- 清橙 A1120 拦截导弹 -- 动态规划(最长上升子序列)
- 【原】最长上升子序列——动态规划
- 【北大夏令营笔记-动态规划】百练2757-最长上升子序列
- caioj1064·动态规划入门(一维一边推2:最长上升子序列)
- sdut.acm 2012级《程序设计基础Ⅱ)》_动态规划 最长上升子序列
- POJ2533 动态规划 (最长上升子序列)
- 动态规划——求最长下降/上升子序列
- sdut1299 最长上升子序列(动态规划)
- 清橙 A1120 拦截导弹 -- 动态规划(最长上升子序列)
- DP练习 最长上升子序列nlogn解法
- joj 2529 Chorus 动态规划 最长上升子序列和最长下降子序列