之前一直是用二分

但是因为比较难理解,写的时候也容易忘记怎么写。

今天比赛讲评的时候讲了一种用树状数组求LIS的方法

(1)好理解,自然也好写(但代码量比二分的大)

(2)扩展性强。这个解法顺带求出以i为结尾的LIS,而很多题要用到这个数组来做

而二分的做法求得是当前长度下的最小值,不容易拓展。

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 1e3 + ;
int a[MAXN], b[MAXN], n, m, ans;
int dp[MAXN], f[MAXN]; inline int lowbit(int x) { return x & (-x); } void motify(int x, int p)
{
for(; x <= m; x += lowbit(x))
f[x] = max(f[x], p);
} int get_max(int x)
{
int res = ;
for(; x; x -= lowbit(x))
res = max(res, f[x]);
return res;
} int main()
{
scanf("%d", &n);
_for(i, , n) scanf("%d", &a[i]), b[i] = a[i]; sort(b + , b + n + );
m = unique(b + , b + n + ) - b - ;
_for(i, , n) a[i] = lower_bound(b + , b + m + , a[i]) - b; int ans = ;
_for(i, , n)
{
dp[i] = get_max(a[i] - ) + ;
ans = max(ans, dp[i]);
motify(a[i], dp[i]);
}
printf("%d\n", ans);
return ;
}

具体怎么做呢

n方的算法有一步去枚举之前所有的元素比较耗时间

可以用树状数组优化这一步,树状数组维护区间最大值

把元素的值当作下标,dp值作为值

a[i]表示当前值,dp[i]表示以i为结尾最长不下降子序列的长度

则 dp[i] = get_max(a[i]) + 1

也就是说,在小于等于当前值a[i]中,最大的dp值+1就是当前的答案

不过这里有个细节,怎么区分最长不下降还是最长上升?

如果你对原理理解透彻的话,这个问题其实很容易解决,你可以停下来自己推一下,检验一下自己理解了没有

如果是最长不下降的话,dp[i] = get_max(a[i]) + 1

如果最长上升的话, dp[i] = get_max(a[i]-1) + 1

最后注意要离散化一下

以下是最长上升子序列的模板

最新文章

  1. Vim基础操作
  2. “添加到收藏夹”功能(share)
  3. SpringFramework的简介
  4. Win10的分辨率问题
  5. 已经被cocos2dx给折腾的想要放弃它,专注Unity3D的怀抱了!
  6. hive操作语句使用详解
  7. 修改ubuntu按电源键触发效果
  8. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )
  9. css2.1实现图片添加阴影效果
  10. 阿里巴巴开源前端框架--Weex实践
  11. Codeforces 750E New Year and Old Subsequence - 线段树 - 动态规划
  12. [蓝桥杯]ALGO-8.算法训练_操作格子
  13. python_basic
  14. php require include 区别
  15. OpenCL 查询平台和设备
  16. 使用 oracle pipelined 返回一个结果集;
  17. Codeforces Round #294 (Div. 2)A - A and B and Chess 水题
  18. Java web中listener、 filter、servlet 加载顺序
  19. java基础----&gt;Reference的使用(一)
  20. Ansible 手册系列 二(安装)

热门文章

  1. ios12--简易购物车
  2. Android Studio报错:DefaultAndroidProject : Unsupported major.minor version 52.0
  3. 什么是IaaS,PaaS和SaaS及其区别
  4. Coursera Algorithms week3 快速排序 练习测验: Selection in two sorted arrays(从两个有序数组中寻找第K大元素)
  5. 使用免费SSL证书让网站支持HTTPS访问
  6. 手动安装jar包到Maven本地仓库
  7. Akka源码分析-深入ActorRef&amp;ActorPath
  8. SpringBoot SpringDataJPA 动态查询、多条件查询
  9. Set-----集合入门
  10. 开始玩qt,使用代码修改设计模式生成的菜单