参见: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. Android 系统开机logo的修改【转】

    本文转载自:http://blog.csdn.net/yandongqiangZHRJ/article/details/8585273 看到了好几个修改logo的博文,但是说的不是很清楚,在这里亲手送 ...

  2. Yslow on Nodejs server

    1. 目的:用yslow测试某个页面的性能 2. 需求:返回yslow测试后的数据,显示在页面 方法一. nodejs 需要把网址打包为har格式... 方法二. phantomjs 步骤: 1. 安 ...

  3. javascript 将变量值作为对象属性 获取对象对应的值

    例子 var var="name"; var objname="obj"; objname=objname+"."+var; alert(e ...

  4. 444D

    分类 首先我们要对询问分类,如果相差log级别就第一种询问,否则第二种. 第一种直接暴力lower_bound,复杂度玄学 第二种归并,复杂度玄学 但是就是过了.感觉很容易卡. #include< ...

  5. AMD 与 CMD 区别

    作者:玉伯链接:https://www.zhihu.com/question/20351507/answer/14859415来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  6. Python 39 数据库

    一:数据存储引擎 1. 什么是引擎? 一个功能的核心部分 引擎可以被分类 例如: 自然 增压 汽油 柴油 混合动力 天然气 核动力 汽油:动力弱,噪音小,震动小 柴油:动力强,污染大,噪音大,震动大 ...

  7. Python 37 进程池与线程池 、 协程

    一:进程池与线程池 提交任务的两种方式: 1.同步调用:提交完一个任务之后,就在原地等待,等任务完完整整地运行完毕拿到结果后,再执行下一行代码,会导致任务是串行执行 2.异步调用:提交完一个任务之后, ...

  8. 数据库操作通用函数,增强可重复利用性能C#,asp.net.sql2005

    using System;using System.Data;using System.Data.SqlClient; namespace com.hua..li{ /// <summary&g ...

  9. js,jquery中.each()方法遍历如何终止循环

    用.each()方法遍历节点的时候,用“return false”只能终止当前循环并跳入下一次循环,并不能终止所有循环.代码如下: $(".days").each(function ...

  10. SQLServer2008 有用的判断函数

    ISNULL(参数1,参数2) 若参数1为空,则返回参数2 NULLIF(参数1,参数2) 若参数1和参数2不等,则返回参数1 若参数1和参数2相等,则返回NULL 例子:ISNULL(NULLIF( ...