Pku acm 1631 Bridging signals 动态规划题目解题报告(十三)

http://acm.pku.edu.cn/JudgeOnline/problem?id=1631

这个题目可以转化为最长上升子序列,这样这个题目似乎就和2533 Longest Ordered Subsequence  1887 Testing the CATCHER一样了,迅速写下代码,结果超时!看来只能用O(nlogn)的算法了。

O(n^2)的算法中:创建一个一维数组array[j]opt[],array[j]表示序列的元素,opt[i]表示以第i个元素结尾的序列中的最长下降子序列,初始化为1,对于一个opt[i],遍历前面的每个元素j,如果array[j]>array[i]opt[j]>=opt[i],那么opt[j]就要加1,在这里,遍历前面的每个元素j,寻找此前最大的子序列时间复杂度为O(n),如果我们在一个有序的序列中查找此前最大的序列长度,我们就可以用二分查找,时间复杂度就会降为O(logn),总的时间复杂度就会为O(nlogn)。为此,我们增加一个一维数组BB[i]表示当前序列为i的末尾元素的最小值。例如对于序列:4 2 6 3 1 5

i

1

2

3

4

5

6

array

4

2

6

3

1

5

opt

1

1

2

2

1

3

B

1

3

5

 

 

 

构建过程如下:

i=1时,opt[i]=1 B[i]=4(当前为1的序列的末尾元素的最小值)

opt

1

1

1

1

1

1

B

4

 

 

 

 

 

i=2时,2不大于4,所以opt[i]=1,B[1]更新为2

opt

1

1

1

1

1

1

B

2

 

 

 

 

 

i=3时,6大于2,所以opt[i]=1+1,B[2]更新为6

opt

1

1

2

1

1

1

B

2

6

 

 

 

 

i=4时,32 6之间,所以opt[i]=1+1,B[2]更新为3

opt

1

1

2

2

1

1

B

2

3

 

 

 

 

i=5时,1小于2,所以opt[i]=1,B[1]更新为1

opt

1

1

2

2

1

1

B

1

3

 

 

 

 

i=6时,5大于3,所以opt[i]=2+1,B[3]更新为5

opt

1

1

2

2

1

3

B

1

3

5

 

 

 

opt[6]就是最后的结果。从构建的过程可以容易的证明一下两点:B是递增的。B是当前序列为i的末尾元素的最小值。以上“2不大于4”,“32 6之间”等等的判断采用二分查找,所以总的时间复杂度为:O(nlogn),核心的c代码如下:

for(i=1;i<=n;i++)
   
   
{
   
   
      num = array[i];
   
   
      left = 1;
   
   
      right = Blen;
   
   
      while(left<=right)
   
   
      {
   
   
          mid = (left+right)/2;
   
   
          if(B[mid]<num)
   
   
             left = mid+1;
   
   
          else
   
   
             right = mid-1;
   
   
      }
   
   
      opt[i] = left;
   
   
      B[left] = num;
   
   
      if(Blen<left)
   
   
          Blen = left;
   
   
     if(max<opt[i])
   
   
              max = opt[i];
   
   
}
   
   
printf("%d/n",max);
   
   

 

带有详细注释的代码可以在http://download.csdn.net/user/china8848/获得

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值