LIS学习笔记(两种算法)O(n^2) 和 O(nlogn)
2017-09-02 10:34:21
writer:pprp
最长上升子序列,具体分析看代码:O(n^2)的做法,dp的思想
分析:每次读一个进行扫描,如果当前读入的这个要比之前的大,
说明有可能加一,所以对当前读入这个之前的元素进行扫描,
扫描到的值加上当前这个值跟该出的值进行比对,确定更大的值
关键代码表示如下:
if( i < n && arr[i] < arr[n] )
f(n) = max(f(i))+ 1;
代码如下:
/*
@theme:LIS最长上升子序列
@writer:pprp
@begin:10:00
@end:10:15
@declare复杂度为O(n^2)
@error:dp[i] = MAX(dp[j]+1,dp[i]),dp[i] = 1初始化为1
@date:2017/9/2
*/ #include <bits/stdc++.h> using namespace std; /*
未优化的最长上升子序列
f(i)代表从头到i的位置最长上升子序列的长度
if( i < n && arr[i] < arr[n] )
f(n) = max(f(i))+ 1;
dp[i]是如果取到arr[i]的时候的最长上升子序列
*/ int dp[],arr[]; int MAX(int a, int b)
{
return a > b ? a : b;
} int main()
{
int N;
while(cin >> N && N)
{
int max = ;
for(int i = ; i < N ;i++)
{
dp[i] = ;
cin >> arr[i];
for(int j = ;j < i ; j++)
{
if(arr[j] < arr[i])
dp[i] = MAX(dp[j] + , dp[i]);
}
max = MAX(max,dp[i]);
}
cout << max << endl;
}
return ;
}
2、采用了优化,记录了可能被选中的点,将其记录在tmp数组中,再从从其中进行查找O(nlog(n))

tmp数组中储存的是对于长度i的lLIS他最小可能的结果,当然是这个数越小越容易得到最大结果了...
/*
@theme:tmp最长上升子序列
@writer:pprp
@begin:10:00
@end:14:32
@declare复杂度为O(n^2)
@error:dp[i] = MAX(dp[j]+1,dp[i]),dp[i] = 1初始化为1
@date:2017/9/2
*/ #include <bits/stdc++.h> using namespace std; int arr[],tmp[];
int len; /*
状态定义:用到tmp数组
tmp[i]:代表的是对于所有长度为i的LIS,他的结果最小有可能是多少,
如果越小那就越容易被取到
tmp中的元素是严格递增的
状态转移:
if( dp[j] = i )
tmp[i] = min(arr[j])
结果查找--用二分的方法去找
if(tmp[i] < arr[n] && tmp[i+1] >= arr[n] )
f[n] = i+1 .... i 代表的是长度 */ //二分查找,在tmp中进行二分查找arr[i]
//对tmp数组进行更新
void bisearch(int x)
{
int left=,mid,right=len;
while(left<=right)
{
mid=(left+right)>>;
if(tmp[mid]<x)
left=mid+;
else
right=mid-;
}
tmp[left]=x;
} int main()
{
int N;
while(cin >> N && N)
{
len=;
cin >> arr[];
tmp[len]=arr[]; for(int i=; i<N; i++)
{
scanf("%d",&arr[i]); if(arr[i] > tmp[len])//如果当前i指向的arr的值大于tmp当前的值
{
len++;
tmp[len]=arr[i];
}//向tmp数组中加入arr的值
else
bisearch(arr[i]);//在tmp中进行查找找到的就将其更新
//如果用lower_bound的话就这样:
//*lower_bound(tmp,tmp+len,arr[i]) = arr[i];
}
printf("%d\n",len);
}
return ;
}
其他图片参考:



LIS学习笔记(两种算法)O(n^2) 和 O(nlogn)的更多相关文章
- Docker学习笔记-两种发布方式
第一种,自己手写dockerfile发布,上传至hubDocker 正常发布到文件夹中,发布文件上传至linux机器上.如 /www/app 将Dockerfile文件也复制到同目录 ./www/ap ...
- WebGL three.js学习笔记 6种类型的纹理介绍及应用
WebGL three.js学习笔记 6种类型的纹理介绍及应用 本文所使用到的demo演示: 高光贴图Demo演示 反光效果Demo演示(因为是加载的模型,所以速度会慢) (一)普通纹理 计算机图形学 ...
- 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)
参考网址:图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) - 51CTO.COM 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath ...
- 最小生成树算法 prim kruskal两种算法实现 HDU-1863 畅通工程
最小生成树 通俗解释:一个连通图,可将这个连通图删减任意条边,仍然保持连通图的状态并且所有边权值加起来的总和使其达到最小.这就是最小生成树 可以参考下图,便于理解 原来的图: 最小生成树(蓝色线): ...
- 强化学习-学习笔记7 | Sarsa算法原理与推导
Sarsa算法 是 TD算法的一种,之前没有严谨推导过 TD 算法,这一篇就来从数学的角度推导一下 Sarsa 算法.注意,这部分属于 TD算法的延申. 7. Sarsa算法 7.1 推导 TD ta ...
- GMM高斯混合模型学习笔记(EM算法求解)
提出混合模型主要是为了能更好地近似一些较复杂的样本分布,通过不断添加component个数,能够随意地逼近不论什么连续的概率分布.所以我们觉得不论什么样本分布都能够用混合模型来建模.由于高斯函数具有一 ...
- 安卓权威编程指南 - 第五章学习笔记(两个Activity)
学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 ...
- 【算法学习笔记】Meissel-Lehmer 算法 (亚线性时间找出素数个数)
「Meissel-Lehmer 算法」是一种能在亚线性时间复杂度内求出 \(1\sim n\) 内质数个数的一种算法. 在看素数相关论文时发现了这个算法,论文链接:Here. 算法的细节来自 OI w ...
- 【学习笔记】分类算法-k近邻算法
k-近邻算法采用测量不同特征值之间的距离来进行分类. 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 使用数据范围:数值型和标称型 用例子来理解k-近邻算法 电影可以按 ...
- STL学习笔记(排序算法)
STL提供了好几种算法对区间内的元素排序.出来完全排序外,还支持局部排序. 对所有元素排序 void sort(RandomAccessIterator beg,RandomAccessIterato ...
随机推荐
- 为什么在Java中不使用finalize()方法
我们都知道finalize()方法是回收分配给对象的内存之前调用垃圾收集器线程的基本语句.在这篇文章中,我们将会深入这个方法. 这篇文章中的章节: 1.finalize()方法不能保证执行(这个将要用 ...
- WCF服务对于处理客户端连接的一点思考
对于每个客户端的,服务端是否为每个客户端有专门的“通道”? 目的:想在服务端记录下来客户端的访问记录(进入.各个操作.离开等信息),并将其执行的操作独立记录在各个客户端对应的日志中. 下面是代码: 契 ...
- python和shell之间变量的相互调用
python -> shell: 1.环境变量 2.字符串连接 3.通过管道 import os var=’123’ os.popen(’wc -c’, ’w’).write(var) 4.通过 ...
- java 多线程 day08 java5多线程新特性
/** * Created by chengtao on 17/12/3. */public class Thread0801_java5_Atomaic { /* 三个包: http://tool. ...
- flask扩展 -- flask-script
Flask-Scropt插件:为在Flask里编写额外的脚本提供了支持.这包括运行一个开发服务器,一个定制的Python命令行,用于执行初始化数据库.定时任务和其他属于web应用之外的命令行任务的脚本 ...
- Flask之初体验
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- 130. Surrounded Regions(周围区域问题 广度优先)(代码未完成!!)
Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...
- Gym 100548F Color 2014-2015 ACM-ICPC, Asia Xian Regional Contest (容斥原理+大数取模)
题意:有N朵花,在M种颜色中选择恰好k种不同的颜色,将这N朵花染色,要求相邻的两朵花颜色不相同. 分析:若限制改为选择不超过k种颜色将N朵花朵染色,则方案数\(f(N,k) = k*(k-1)^{N- ...
- design thinking
- [User Defaults] Failed to read values in CFPrefsPlistSource (iOS 10)
最近遇到一个bug,偶发,后来发现概率还挺高(10%). NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults]; ...