自己在做有关俄罗斯套娃的题目时,发现自己写出的一个方法可以解决求最长上升子序列(LIS)和最长下降子序列(LDS)的问题。

俄罗斯套娃:这个问题在前一篇中讲的有,在此处就不多讲了~链接

 求最长上升子序列:

给定排好序的一堆数列中,求其的LIS长度。它的LIS长度就是它非上升子序列的个数。

WHY?

其实自己模拟一下就可以发现:计算出第一组非上升子序列,它的最后一个数一定是这组数列的最小的一个数;第二组非上升子序列的最后一个数就一定会是剩下的数中最小的一个..........哪么,上升子序列的长度是多少,就一定可以排出多少组非上升子序列~但每一组非上升子序列的最后一个数并不一定就是所求上升子序列的里的数,但每一组一定有一个数是所求最长上升子序列里的数.........

PS:(把上面这段话写清楚一些~)

因为给出的数字(a[])是已经排好序的,因此这组数字的最长上升子序列的第一个数(用b[0]表示),b[0]应该在这组数(a[])的第一组非上升子序列里面。

WHY1?

//     这是因为第一组最长非上升子序列是从这组数的第一个数字开始的而且是能搜索到这组数(a[])最小的数字的!!!故最长上升子序列的第一个数b[0],只能在第一组非上升子序列里~

哪么~b[0]确定的话,b[1]是绝对不会在b[0]这组里面,它存在于第二组非上升子序列里~

WHY2?

//     因为排好的是第一组非上升子序列,若b[0]确定是这组的某个数,哪么该数后面的数绝对<=b[0],故b[1]只会在第二组非上升子序列里,至于这个为什么~请参照WHY1(为什么b[0]在第一组非上升子序列里)

同理~剩下b[]就在接下来的非上升子序列里了~~~~~

............................. = =感觉写的还是........不是很清楚啊.........算了~就这样了,懒得再写了~.....= =

那么肿么输出最长上升子序列?

从最后开始记起~另开一个数组b[]记录LIS值。设给定的数组为a[],它的LIS的长度为number,并把数组已经按非上升子序列分好组,并已经作好标记(列如:是第一组非上升子序列,就标记为1;是第2组就标记为2;以此类推.......)。

从数列的最后开始扫描,当a[i]=number时,就记录b[number]=a[i],并且number--;......一直扫到a[0]结束~b[]记录的就是其中一组的最长上升子序列~

例如:9,10,6,7,2,1,8,4,3,5

第一组非上升子序列是:9 6 2 1--------------记为1

第二组非上升子序列是:10 7 4 3-------------记为2

第三组非上升子序列是:8 5-------------------记为3

那么从后面扫到的第一个符合要求的是5,接着是3,再者是1

然后输出的是:1 3 5

1 3 5就是这组数列其中最小的一组最长上升子序列~

在此感谢荆红浅醉小童鞋的帮助~~

代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; class P
{
public:
int x,id;
}a[]; int main()
{
int n,i,j,number,minn,b[];
while(~scanf("%d",&n))
{
memset(a,,sizeof(a));
for(i=;i<n;i++)
scanf("%d",&a[i].x);
number=;
printf("LIS:\n");
for(i=;i<n;i++)
if(a[i].id==)
{
number++; //有一组新的非上升子序列,个数就加1
a[i].id=number;
minn=a[i].x;
for(j=i+;j<n;j++)
{
if(a[j].id== && a[j].x<=minn)
{
a[j].id=number; //是哪一组的非上升子序列就记录下来它的组值~
minn=a[j].x; //更新每一组非上升子序列的最小值
}
}
}
for(i=n-,j=number;i>=;i--) //从数列的后面开始扫描~
{
if(a[i].id==j) //当遇到id为j,就是所要输出的值,要记入数组b[]中,并找下一个要求值,此时j--
{
b[j]=a[i].x;
j--;
}
}
for(i=;i<=number;i++) //输出的b[]就是所求的一个最长上升子序列(应该是最小的一个~)
printf("%d ",b[i]);
printf("\nLIS number:");
printf("%d\n",number);
}
return ;
}

那么~求最长下降子序列方法与上面相反~

LIS,LDS的另类算法(原)的更多相关文章

  1. BZOJ 1609 [Usaco2008 Feb]Eating Together麻烦的聚餐:LIS & LDS (nlogn)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1609 题意: 给你一个只由数字"1,2,3"组成的序列a[i],共n个 ...

  2. POJ 1836 Alignment --LIS&LDS

    题意:n个士兵站成一排,求去掉最少的人数,使剩下的这排士兵的身高形成“峰形”分布,即求前面部分的LIS加上后面部分的LDS的最大值. 做法:分别求出LIS和LDS,枚举中点,求LIS+LDS的最大值. ...

  3. 多校联合练习赛1 Problem1005 Deque LIS+LDS 再加一系列优化

    Deque Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  4. k均值聚类算法原理和(TensorFlow)实现

    顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...

  5. LIS的O(nlogn)算法

    出自蓝书<算法竞赛入门经典训练指南> 求最长上升子序列是很常见的可以用动态规划解决的问题…… 很容易根据最优子结构之类的东西得出 $\text{dp}[i]$为以第i个数结尾的最长上升子序 ...

  6. K-means聚类算法原理和C++实现

    给定训练集$\{x^{(1)},...,x^{(m)}\}$,想把这些样本分成不同的子集,即聚类,$x^{(i)}\in\mathbb{R^{n}}$,但是这是个无标签数据集,也就是说我们再聚类的时候 ...

  7. 机器学习之感知器算法原理和Python实现

    (1)感知器模型 感知器模型包含多个输入节点:X0-Xn,权重矩阵W0-Wn(其中X0和W0代表的偏置因子,一般X0=1,图中X0处应该是Xn)一个输出节点O,激活函数是sign函数. (2)感知器学 ...

  8. URL短网址生成算法原理和php实现案例

    短网址(Short URL),顾名思义就是在形式上比较短的网址. 短链接的好处:1.内容需要:2.用户友好:3.便于管理为什么要这样做的,原因我想有这样几点:微博限制字数为140字一条,那么如果我们需 ...

  9. LIS(nlogn)算法描述//线性DP经典类型

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

随机推荐

  1. Windows7 下安装 CentOS6.5

    内容来自:http://blog.163.com/for_log/blog/static/2162830282013031031278/第一部分:安装前准备1. 准备两个fat32格式的分区,一个用于 ...

  2. js与uri中location关系

    //获取域名host = window.location.host;host2=document.domain; //获取页面完整地址url = window.location.href; docum ...

  3. PHP生成制作验证码

    看完就会,不会你打我,话不多说.开搞(人狠话不多) 1.0 首先先看代码 <?php header("Content-Type:text/html;Charset=UTF-8" ...

  4. MySQL数据库添加一个字段

    MySQL数据库添加一个字段 1.添加一个字段 alter table tableName add 列名  数据类型; 2.添加一个字段设置默认值 alter table tableName add ...

  5. Oracle课堂实验一“表的使用”代码。

    --创建本地管理表空间CustomerTBSCREATE TABLESPACE CustomerTBS         DATAFILE 'd:\Oracle11\product\11.2.0\ora ...

  6. 定时工作方式2实现1s定时

    定时器的几种工作方式中,除0和前面的1类似都需要初始化计数值,然后开始计数,计数溢出后,需要再次控制计数的初值,但工作模式2不同于此,工作方式2将THx和TLx分开处理,将初值存放在THx中,计数时只 ...

  7. xcode 自动添加注释,生成文档

    一.自动生成注释代码        添加一个快捷键,生成 注释代码        ThisService 下载连接:http://wafflesoftware.net/thisservice/     ...

  8. 类集对enum的支持。

    1,EmumMap public class EnumMap<K extends Enum<K>,V>extends AbstractMap<K,V>impleme ...

  9. XCode 项目配置说明

    初学XCode最让人头疼的就是项目各属性设置,各种不解,这里做个总结: 项目配置: 基本项(Basic) 1.Architectures(指令集)——设置你想支持的指令集,目前ios的指令集有以下几种 ...

  10. Android之EditText组件学习

    一.基础学习 1.Button是TextView的一个子类,所以按钮本身是一个特殊的文本,属性和TextView相似 2.EditText类似html里的input type="text&q ...