zoukankan      html  css  js  c++  java
  • POJ1631(Bridging signals)

    题目链接

    题目的本质就是求最长不下降子序列,这是动态规划的典型,很容易写出O(n2)的算法,但由于MAX=40000,普通算法会超时,必须采用更快的算法。下面简单介绍求最长不下降子序列(可推广到其他类型)的O(nlogn)算法。

    假设数字序列为a[N](也可不用保存,一边读入一边处理),先介绍如何求以第一个元素开头的最长不下降子序列,我们会用到一个数组d[N],d[k]保存的是数组a中以第一个元素开头的所有长为k的不下降子序列最后一个元素的最小值(下面将简称为最小最后元素),显然d的长度len即为所求。而且容易用反证法证明这个数组是递增的,若存在i<j,且d[i]>d[j],可以这样想,既然存在一个长为j的且最后一个元素为d[j]的不下降子串,则必然存在一个长为i(i<j)且最后一个元素为d[j]的不下降子串,所以d[i]<=d[j],与假设矛盾。初始化的时候,d中只有一个元素,即数字序列的第一个元素,显然以第一个元素开头且长为1的子串只有一个,所以d[1]=a[1],初始化过后,d数组满足定义(d[k]保存以第一个数字开头的长为k的最小最后元素),接着,每次读入一个数字时,相当数组a新增一个元素,我们设为tmp,我们的任务就是维持d数组的定义,具体操作如下:若tmp>=d[len],则可以直接加入到数组d中,这个容易理解,若tmp<=d[1],则直接抛弃,这两种情况都容易理解,关键在于tmp>d[1]&&tmp<d[len],这时需将d数组中第一个(从1到len)大于tmp的数字更新为tmp,因为d是有序的,所以可以使用二分查找,然后更新。当a数组确定后(数据读入完成),数组d也就确定了,此时数组d的长度就是数组a中以第一个数开头的最长不下降子序列的长度。读入数据使用一层循环,查找更新需一层循环,由于查找时用了二分,所以总的时间复杂度为O(nlogn)。到此为止,我们已经完成了一大半工作,只需一个很少的变动,即可用上面的算法来求数组a的最长不下降子序列的长度,且时间复杂度仍为O(nlogn),这是一个很有创造性的改进,我们只需给在数组a前面新增一个数字-INF(负无穷大),此时a数组第一个数是-INF,第二个数是原来的第一个数,一次类推,第n+1个数为原数组a的第n个数,使用上面的算法求以第一个数开头的最长不下降子序列,即以-INF开头的最长不下降子序列,看出名堂来了吗?以-INF开头的最长不下降子序列长度=原数组a最长不下降子序列长度+1。需说明的是,实际处理时,只需将数组d第一个数初始化为-INF即可。到此为止,大功告成。

    View Code
     1 #include <stdio.h>
    2 #define N 40000
    3 #define INF 0x7fffff
    4 int d[N],n;
    5 int main()
    6 {
    7 int t,i,tmp,len,max,min,mid;
    8 scanf("%d",&t);
    9 while(t--)
    10 {
    11 d[0]=-INF,len=0;
    12 scanf("%d",&n);
    13 for(i=0;i<n;i++)
    14 {
    15 scanf("%d",&tmp);
    16 if(tmp>d[len]) d[++len]=tmp;
    17 else
    18 {
    19 min=0,max=len;
    20 mid=(min+max+1)>>1;
    21 while(mid<max)
    22 {
    23 if(tmp<=d[mid]) max=mid;
    24 else min=mid;
    25 mid=(min+max+1)>>1;
    26 }
    27 d[mid]=tmp;
    28 }
    29 }
    30 printf("%d\n",len);
    31 }
    32 return 0;
    33 }
  • 相关阅读:
    苹果信息推送服务(Apple Push Notification Service)使用总结
    Xcode 相关路径总结
    微信红包随机算法 OC
    Xcode真机测试could not find developer disk image解决方法
    字典转模型 重写初始化方法
    Xcode 写代码没有补全提示解决:删缓存及显示隐藏文件命令
    按位与、或、异或等运算方法
    OC语言@property @synthesize和id
    iOS开发—Quartz2D简单介绍
    iOS开发—CoreLocation定位服务
  • 原文地址:https://www.cnblogs.com/algorithms/p/2431418.html
Copyright © 2011-2022 走看看