题目链接: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的更多相关文章

  1. 小明的密码-初级DP解法

    #include #include #include using namespace std; int visited[5][20][9009];// 访问情况 int dp[5][20][9009] ...

  2. hdu_4352_XHXJ's LIS(数位DP+状态压缩)

    题目连接:hdu_4352_XHXJ's LIS 题意:这题花大篇篇幅来介绍电子科大的一个传奇学姐,最后几句话才是题意,这题意思就是给你一个LL范围内的区间,问你在这个区间内最长递增子序列长度恰为K的 ...

  3. luogu5010 HMR的LIS III (dp+线段树)

    这个东西和最长上升子序列很像 考虑如果已经知道每个位置为开头的LIS长度和个数 f[i],我可以扫一遍 判断这个个数和K的大小,找到第一个长度=len而且个数<K的,这个位置就是要选的 然后K- ...

  4. HDU 4352 XHXJ's LIS 数位dp lis

    目录 题目链接 题解 代码 题目链接 HDU 4352 XHXJ's LIS 题解 对于lis求的过程 对一个数列,都可以用nlogn的方法来的到它的一个可行lis 对这个logn的方法求解lis时用 ...

  5. HDU.4352.XHXJ's LIS(数位DP 状压 LIS)

    题目链接 \(Description\) 求\([l,r]\)中有多少个数,满足把这个数的每一位从高位到低位写下来,其LIS长度为\(k\). \(Solution\) 数位DP. 至于怎么求LIS, ...

  6. XHXJ's LIS(数位DP)

    XHXJ's LIS http://acm.hdu.edu.cn/showproblem.php?pid=4352 Time Limit: 2000/1000 MS (Java/Others)     ...

  7. 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 ...

  8. 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 ...

  9. (探讨贴)POJ 1463 树形DP解法的不正确性

    POJ1463是一个典型的树状DP题. 通常解法如下代码所示: using namespace std; ; ]; int pre[maxn]; int childcnt[maxn]; int n; ...

随机推荐

  1. 接口测试maven管理

    接口测试框架选择 界面化工具,针对不会编码的测试人员: 1.Jmeter性能测试工具,不具备完备的接口测试框架功能 2.Robotframerwork 3.PostMan 推荐框架: ResrAssu ...

  2. linux下给php安装curl、gd(ubuntu)

    安装方法很简单,只需要一条命令. # sudo apt-get install curl libcurl3 libcurl3-dev php5-curl 恭喜,PHP5 cURL安装完毕.记得重启Ap ...

  3. ORA-03113:通信通道的文件结尾

    问题: 用命令startup启动实例时,报错“ORA-03113:通信通道的文件结尾”. 解决: SQL> startup mount ORACLE 例程已经启动. Total System G ...

  4. labview如何生成可执行文件

    labview生成可执行文件可以分为两种情况. 第一种,是电脑中有labview软件开发环境的情况 第二种,是电脑中没有安装labview软件开发环境 下面是一个简单的labview代码: 程序解释: ...

  5. Scrapy爬取人人网

    Scrapy发送Post请求 防止爬虫被反主要有以下几个策略 动态设置User-Agent(随机切换User-Agent,模拟不同用户的浏览器信息) 禁用Cookies(也就是不启用cookies m ...

  6. Chrome 鼠标左键-新标签打开

    改chrome设置 1.打开google搜索主页2.打开右下角Settings选项->Search Settings3.找到where results open选项4.把Open each se ...

  7. 报表系统OLAP

    实现报表系统可自定义定制: 1.纬度,事实表,用户自定义观察纬度,实现报表自定义(自定义纬度树结构---通过这个树结构,后台自动生成报表SQL,用户仅仅配置纬度关系即可)----报表配置纬度关 系 2 ...

  8. logger常用方法

    #!/usr/bin/env python # encoding: utf-8  # Date: 2018/5/25 import loggingfrom logging import handler ...

  9. python之路_函数实例及装饰器介绍

    一.习题讲解 1.写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组.例如:[(‘红心’,2), (‘草花’,2), …(‘黑桃,‘A’)] def cards(): num=[] for v ...

  10. GlusterFS PERFORMANCE TUNING

    众所周知,glusterfs对小文件而言,就是个鸡肋,特别是在一个目录下有过W的小文件图片时,ls简单就是个坑,下面我对线上的glusterfs参数做一些优化调整,调整的命令: gluster vol ...