LIS问题(DP解法)---poj1631
题目链接:http://poj.org/problem?id=1631
这个题题目有些难看懂hhh,但实质就是求LIS--longest increasing sequence。
以下介绍LIS的解法模板:
一.O(n^2)解法
用a数组存储数据,f[i]表示以a[i] 结尾的最长子序列的长度,这样max(f[i])就是所求结果。
代码如下:
#include<cstdio>
#include<algorithm>
using namespace std; int n,p;
int a[],f[];
int res; int main(){
scanf("%d",&n);
while(n--){
res=;
scanf("%d",&p);
for(int i=;i<=p;i++)
scanf("%d",&a[i]),f[i]=;
for(int i=;i<=p;i++)
for(int j=;j<i;j++)
if(a[j]<a[i]){
f[i]=max(f[i],f[j]+);
if(f[i]>res) res=f[i];
}
printf("%d\n",res);
}
return ;
}
但是算法复杂度为n2,题目p为4e4,还是多组询问,明显会超时。
二 . O(nlogn)解法
假设数字序列为a[N](也可不用保存,一边读入一边处理),我们会用到一个数组f[N],f[k]保存的是数组a中所有长为k的不下降子序列最后一个元素的最小值(下面将简称为最小最后元素),显然f的长度len即为所求。而且容易用反证法证明这个数组是递增的,若存在i<j,且f[i]>f[j],可以这样想,既然存在一个长为j的且最后一个元素为f[j]的不下降子串,则必然存在一个长为i(i<j)且最后一个元素为f[j]的不下降子串,所以f[i]<=f[j],与假设矛盾。初始化的时候,f中只有一个元素,即数字序列的第一个元素,显然f[1]=a[1],接着,每次读入一个数字时,相当数组a新增一个元素,我们设为tmp,我们的任务就是维持f数组的定义,具体操作如下:若tmp>f[len],则f[++len]=tmp,这个容易理解,若tmp<=f[1],则f[1]=tmp,这两种情况都容易理解,关键在于tmp>f[1]&&tmp<=f[len],这时需将f数组中第一个(从1到len)大于tmp的数字更新为tmp(这么做的原因是为了使后面输入时形成更长的上升子序列,不理解的话可以举个例子好好想想),因为f是有序的,所以可以使用二分查找,然后更新。当a数组确定后(数据读入完成),数组f也就确定了,此时数组f的长度就是数组a中以第一个数开头的最长不下降子序列的长度。读入数据使用一层循环,查找更新需一层循环,由于查找时用了二分,所以总的时间复杂度为O(nlogn)。至此算法就结束了。
AC代码如下:
#include<cstdio>
#include<algorithm>
using namespace std; int n,p;
int f[];
int len; int main(){
scanf("%d",&n);
while(n--){
len=;
scanf("%d",&p);
int tmp;
scanf("%d",&tmp);
f[++len]=tmp;
p--;
while(p--){
scanf("%d",&tmp);
if(tmp>f[len]) f[++len]=tmp;
else if(tmp<=f[]) f[]=tmp;
else{
int l=,r=len,m;
while(l<=r){
m=(l+r)/;
if(f[m]>=tmp) r=m-1;else l=m+;
}
f[l]=tmp;
}
}
printf("%d\n",len);
}
return ;
}
这个是求最长上升子序列。
求最长不下降子序列的代码如下:
#include<cstdio>
#include<algorithm>
using namespace std; int n,p;
int f[];
int len; int main(){
scanf("%d",&n);
while(n--){
len=;
scanf("%d",&p);
int tmp;
scanf("%d",&tmp);
f[++len]=tmp;
p--;
while(p--){
scanf("%d",&tmp);
if(tmp>=f[len]) f[++len]=tmp;
else if(tmp<f[]) f[]=tmp;
else{
int l=,r=len,m;
while(l<=r){
m=(l+r)/;
if(f[m]>tmp) r=m-;
else l=m+;
}
f[l]=tmp;
}
}
printf("%d\n",len);
}
return ;
}
LIS问题(DP解法)---poj1631的更多相关文章
- 小明的密码-初级DP解法
#include #include #include using namespace std; int visited[5][20][9009];// 访问情况 int dp[5][20][9009] ...
- hdu_4352_XHXJ's LIS(数位DP+状态压缩)
题目连接:hdu_4352_XHXJ's LIS 题意:这题花大篇篇幅来介绍电子科大的一个传奇学姐,最后几句话才是题意,这题意思就是给你一个LL范围内的区间,问你在这个区间内最长递增子序列长度恰为K的 ...
- luogu5010 HMR的LIS III (dp+线段树)
这个东西和最长上升子序列很像 考虑如果已经知道每个位置为开头的LIS长度和个数 f[i],我可以扫一遍 判断这个个数和K的大小,找到第一个长度=len而且个数<K的,这个位置就是要选的 然后K- ...
- HDU 4352 XHXJ's LIS 数位dp lis
目录 题目链接 题解 代码 题目链接 HDU 4352 XHXJ's LIS 题解 对于lis求的过程 对一个数列,都可以用nlogn的方法来的到它的一个可行lis 对这个logn的方法求解lis时用 ...
- HDU.4352.XHXJ's LIS(数位DP 状压 LIS)
题目链接 \(Description\) 求\([l,r]\)中有多少个数,满足把这个数的每一位从高位到低位写下来,其LIS长度为\(k\). \(Solution\) 数位DP. 至于怎么求LIS, ...
- XHXJ's LIS(数位DP)
XHXJ's LIS http://acm.hdu.edu.cn/showproblem.php?pid=4352 Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 4352 - XHXJ's LIS - [数位DP][LIS问题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- hdu 4352 XHXJ's LIS 数位dp+状态压缩
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others ...
- (探讨贴)POJ 1463 树形DP解法的不正确性
POJ1463是一个典型的树状DP题. 通常解法如下代码所示: using namespace std; ; ]; int pre[maxn]; int childcnt[maxn]; int n; ...
随机推荐
- Appscan安装问题记录 + 最后问题解决的方法 和安装步骤
最后环节有问题,无法创建常规任务,腰折, 估计是在安装环节不可以忽略下面的报错,有空解决一下这个问题 解决: 安装了一个虚拟机W7系统 可以安装成功 appscan9.0.3要W8的系统 最后装了ap ...
- position和margin的绝对定位和相对定位
电脑桌面清理干净之后,果然快了很多,桌面上的东西会占用内存,导致电脑变慢,以前我看到表姐的电脑桌面堆满了东西,我就在心里默默的鄙视不懂玩电脑的人,现在我竟然也养成了这种坏毛病..保存东西的时候放在桌面 ...
- 本地环境 XAMPP+phpStorm+XDebug+chrome配置和断点调试 注册方法
我的安装环境:XAMPP版本号V3.1.0 ;phpStorm版本8.0.3;windowsxp 32bit.您老人家先过目一下,不然怕影响意义. XAMPP.phpStorm 都直接安装在了D盘根目 ...
- Dubbo与Zookeeper、Spring整合使用
Dubbo与Zookeeper.Spring整合使用 Dubbo采用全spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spri ...
- python 9*9示例
# 9*9 乘法表# def nine_nine():# for i in range(1, 10):# for j in range(1, i+1):# ...
- JS 传各种文件到后端
由于要写一个前端上传文件按钮功能,本人前端是小白,所以在网上搜索了许多,发现FileReader非常好用. 不多BB,直接来. 1,前端只需要一个input标签, <input type=&qu ...
- 分水岭算法(理论+opencv实现)
分水岭算法理论 从意思上就知道通过用水来进行分类,学术上说什么基于拓扑结构的形态学...其实就是根据把图像比作一副地貌,然后通过最低点和最高点去分类! 原始的分水岭: 就是上面说的方式,接下来用一幅图 ...
- nginx支持pathinfo的方法,亲测有效的
修改配置文件,修改特点域名的配置文件 location ~ \.php { #去掉$ root H:/PHPServer/WWW; fastcgi_pass ; fastcgi_index index ...
- jap 事务
事物传播行为介绍: @Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下) @Transact ...
- IP 别名和辅助 IP 地址
https://blog.csdn.net/xiewen99/article/details/54729112?utm_source=itdadao