参见:LIS,LDS的另类算法(原)

然后讲讲我的想法:  有结论不上升子序列的个数=最长上升子序列的长度.....至于为什么,在下面讲

上代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
class P
{
public:
int x,id; //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) //找到满足编号及大小的数 ⑤
{
b[j]=a[i].x;
j--; //组编号-1
}
}
for(i=;i<=number;i++) ⑥
printf("%d ",b[i]);
printf("\nLIS number:");
printf("%d\n",number);
}
return ;
}

从第一个数据开始,找到第一个未被标记的数①,记录组编号,并标记为组编号②,再在这个数之后找未被标记的<=它的数③,标记为组编号,并更新最小值④,循环。

最后从最后一个数扫描,标记=编号--⑤的第一个数就记录下来,在就是正序输出这些数⑥。

例:   数组:9      10       6        7       2       1     8       4     3     5

组的编号:  1       2        1         2       1       1      3      2     2     3

从最后一个扫描,找到第一个编号为3的数:5

再找编号为2 的数:3

再找编号为1的数:1

所以顺序输出为1 3 5,长度3

从上得知,每一组出一个数组成最长上升子序列,这就是为什么最长上升子序列的长度=不上升子序列的个数了~~~

本来只是用来做俄罗斯套娃这道题,后来发现做导弹拦截系统这道题也可以,再发现就是求最长上升子序列,后来想办法把上升序列打出来,中间当然有很多错误,两个人慢慢讨论,一点点完善,修改,测试,就有个这段代码。

还是不懂的翻到最前面,戳进那个网页~\(≧▽≦)/~啦啦啦

LID&LDS 的另外一种算法的更多相关文章

  1. nignx 负载均衡的几种算法介绍

    负载均衡,集群必须要掌握,下面介绍的负载均衡的几种算法.   1 .轮询,即所有的请求被一次分发的服务器上,每台服务器处理请求都相同,适合于计算机硬件相同.   2.加权轮询,高的服务器分发更多的请求 ...

  2. [BS-28] iOS中分页的几种算法

    iOS中分页的几种算法 总记录数:totalRecord 每页最大记录数:maxResult 算法一: totalPage = totalRecord % maxResult == 0 ? total ...

  3. 从零开始学C++之STL(四):算法简介、7种算法分类

    一.算法 算法是以函数模板的形式实现的.常用的算法涉及到比较.交换.查找.搜索.复制.修改.移除.反转.排序.合并等等. 算法并非容器类型的成员函数,而是一些全局函数,要与迭代器一起搭配使用. 算法的 ...

  4. BitSet: 有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来?

    package common; import java.util.ArrayList; import java.util.BitSet; import java.util.List; import j ...

  5. 浅析负载均衡的6种算法,Ngnix的5种算法。

    浅析负载均衡的6种算法,Ngnix的5种算法.浮生偷闲百家号03-21 10:06关注内容导读其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果.源地址哈希的思想是根据获取客 ...

  6. 算法入门:最大子序列和的四种算法(Java)

    最近再学习算法和数据结构,推荐一本书:Data structures and Algorithm analysis in Java 3rd 以下的四种算法出自本书 四种最大子序列和的算法: 问题描述 ...

  7. 可以进行SHA-1,SHA-224,SHA-256,SHA-384,SHA-512五种算法签名的工具类,以及简单说明

    import java.security.MessageDigest; public class SignatureSHA { public static String signSHA(String ...

  8. LeetCode 531----Lonely Pixel I----两种算法之间性能的比较

    Lonely Pixel I 两种算法之间的性能比较 今天参加LeetCode Weekly Contest 22,第二题 "Lonely Pixel I" 问题描述如下: Giv ...

  9. 谈谈"求线段交点"的几种算法(js实现,完整版)

    "求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法总结一下, 希望对大家有所帮助.  ...

随机推荐

  1. mongoDB学习笔记——安装及启动

    WINDOWS环境下: 一.安装 步骤一:  下载MongoDB  url下载地址:  http://downloads.mongodb.org/win32/ 步骤二:  设置MongoDB程序存放目 ...

  2. [CTSC 2008] 祭祀

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1143 [算法] 答案为最小路径可重复点覆盖所包含的路径数,将原图G进行弗洛伊德传递闭 ...

  3. 92. extjs specialkey监听回车按键

    转自:http://blog.sina.com.cn/s/blog_647a022e0101401n.html 1 监听表单字段事件: Ext使得对用户某个动作的监听特别简单,诸如单击某个元素或者按下 ...

  4. 0423-mysql查询语句大全

    建表.数据插入代码: #新建学生表 drop table if exists student; create table student( sno ) not null primary key com ...

  5. 时间框的属性编辑(WdatePicker日期插件)

    效果图如下:可以设置输入的时间不大于,或不小于某日. //引用js包 <script type="text/javascript" src="${basePath} ...

  6. Rabbit--ack机制

    消息应答时执行一个任务可能需要花费几秒钟,你可能会担心如果一个消费者在执行任务过程中挂掉了. 一旦RabbitMQ将消息分发给了消费者,就会从内存中删除.在这种情况下,如果正在执行任务的消费者宕机,会 ...

  7. swift-delegate(代理)或者block传值

    1:delegate或者block传值 import UIKit class ViewController: UIViewController,TestDelegatePassValueDelegat ...

  8. Clustered Index Scan 与 Clustered Index Seek

    Clustered Index Scan 与 Clustered Index Seek 在利用 SQL Server 查询分析器的执行计划中,会有许多扫描方式,其中就有 Clustered Index ...

  9. hibernate中的懒加载和急加载

    懒加载(FatchType.LAZY)是Hibernate为提高程序执行效率而提供的一种机制,简单说就是只有正真使用其属性的时候,数据库才会进行查询. 具体的执行过程就是:Hibernate从数据库获 ...

  10. 安卓多线程——AsyncTask

    在采集视频的同时需要对视频进行实时处理,因此要使用到多线程. AsyncTask是android提供的一个处理异步任务的框架,相当于Handler+Thread.相比而言,AsyncTask的优点是封 ...