第一问就是求最长不上升子序列的长度,要写O(nlogn)的算法。。。。

  对于这种nlogn的算法,只能求出长度,不能求出具体的序列。这种算法实现过程如下:

  我们定义len为到目前为止最长不上升子序列的长度,d[l]表示此长度为l的不上升子序列的末尾数据中最下的那个,a[i]为输入的第i个结果。先使d[1]=1,len=1。我们从i=2(i<=n)开始看:

  如果a[i]<=d[len],那么使d[++len]=a[i],即扩充一下目前的最长不上升子序列;

  否则,a[i]>d[len],就在数组d中从前往后找到第一个<a[i]的元素d[j],此时d[i1,2,...,j-1]都>=a[i],那么它完全可以接上d[j-1]然后生成一个长度为j的不上升子序列,而且这个子序列比当前的d[j]这个子序列更有潜力(因为这个数比d[j]大),所以就替换掉它就行了。

  第二问可由Dilworth定理(大致意思是一个数列分成不上升(或不下降)子序列的最小数=该数列的最长上升(或下降)子序列的长度)知该问是求最长上升子序列的长度。思路与第一问一模一样。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int a[1000000],d[1000000];
void bss();
void ss();
int n;
int main()
{
          char ch=' ';
          while(ch==' ')
          {
                cin>>a[++n];
                ch=getchar();
          }
          bss();
          ss();
          return 0;
}

void bss()                           //求最长不上升子序列
{
         int len=1;
         d[len]=a[1];
         for(int i=2;i<=n;i++)
         {
                 if(a[i]<=d[len])
                 d[++len]=a[i];
                 else
                 {
                         for(int j=1;j<=len;j++)
                         if(d[j]<a[i])
                         {
                                 d[j]=a[i];
                                 break; 
                         } 
                 }
          }
         cout<<len<<endl;
}

void ss()                             //求最长不下降子序列
{
          int len=1;
          d[len]=a[1];
          for(int i=2;i<=n;i++)
          {
                 if(a[i]>d[len])
                 d[++len]=a[i];
                 else
                 {
                          if(a[i]!=d[len])
                          {
                                    for(int j=1;j<=len;j++)
                                    if(d[j]>=a[i])
                                     {
                                              d[j]=a[i];
                                              break; 
                                      } 
                           }
                  }
           }
            cout<<len;
}

最新文章

  1. WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体
  2. Visual Studio (VSIX,项目模板 )制作
  3. [转]Excel导入异常Cannot get a text value from a numeric cell解决
  4. isPrototypeOf&amp;&amp;getPrototypeOf
  5. mysql存储过程语法及实例
  6. DDD~领域事件与事件总线
  7. LeetCode - Path Sum
  8. Spring AOP专业术语解析
  9. msysgit ls 中文显示
  10. U3D刚体测试3(constraints)
  11. Service(一)-----&gt;简单计算
  12. MVC 删除文件
  13. Com和DCOM
  14. 瑞丽的SQL-SQL Server的表旋转(行列转换)
  15. POJ 2083 Fractal 分形
  16. 微信小程序教学第二章:小程序中级实战教程之预备篇 - 项目结构设计&#160;|基于最新版1.0开发者工具
  17. LeetCode OJ 143. Reorder List(两种方法,快慢指针,堆栈)
  18. UOJ #103:【APIO2014】Palindromes
  19. Jsp&amp;Servlet入门级项目全程实录第4讲
  20. 王者荣耀交流协会PSP Daily项目Postmortem结果

热门文章

  1. Mysql索引基础原理
  2. vue中使用promise
  3. swiper默认第二个且居中
  4. C++中为何大量使用类指针
  5. [js]顶部导航和内容区布局
  6. 继承:继承后子类构造函数具有隐式super,所以子类中所以的构造函数默认会访问父类中的空参数的构造函数
  7. DL中epoch、batch等的意义【转载】
  8. tf.nn.embedding_lookup函数【转载】
  9. k8s 容器的生命周期钩子
  10. 数据分析与挖掘 - R语言:贝叶斯分类算法(案例三)