a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 152|回复: 2

[C++] 2011年计算机等级考试二级C++辅导实例编程(27)

[复制链接]
发表于 2012-7-31 21:56:58 | 显示全部楼层 |阅读模式
 最长上升子序列LIS算法实现  最长上升子序列问题是各类信息学竞赛中的常见题型,也常常用来做介绍动态规划算法的引例,笔者接下来将会对POJ上出现过的这类题目做一个总结,并介绍解决LIS问题的两个常用算法(n^2)和(nlogn).
, S9 a- v6 ?+ n+ {  l0 A4 j# O! `7 D! V4 J# I, e
  问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7....an,求它的一个子序列(设为s1,s2,...sn),使得这个子序列满足这样的性质,s1
回复

使用道具 举报

 楼主| 发表于 2012-7-31 21:56:59 | 显示全部楼层

2011年计算机等级考试二级C++辅导实例编程(27)

{  m=0;& C0 F( H0 S: a- b  j: |7 r
  for(j=1;jm&&a[j]ans)  X  N, {8 i0 @/ R! g* z
  ans=dp;1 _' ~9 p: s# n/ L
  }! x( G4 [9 J: @
  return ans;
% W0 F( m& p" J# L% W+ D  }
# s% c' E" {9 |6 }' R2 O  算法2(nlogn):维护一个一维数组c,并且这个数组是动态扩展的,初始大小为1,c表示最长上升子序列长度是i的所有子串中末尾最小的那个数,根据这个数字,我们可以比较知道,只要当前考察的这个数比c大,那么当前这个数一定能通过c构成一个长度为i+1的上升子序列。当然我们希望在C数组中找一个尽量靠后的数字,这样我们得到的上升子串的长度最长,查找的时候使用二分搜索,这样时间复杂度便下降了。
& W6 d1 r. d  [/ }  模板如下:- ~5 H( k9 @) G4 E: A0 f6 c
  //最长上升子序列nlogn模板- O! [& S4 w: l- |0 b/ \  U! p5 R
  //入口参数:数组名+数组长度,类型不限,结构体类型可以通过重载运算符实现+ E6 K) f2 _" D" w. v$ j, D
  //数组下标从1号开始。2 S& e1 n- y, d! m- M* S+ W7 @- B6 `
  /**//////////////////////////BEGIN_TEMPLATE_BY_ABILITYTAO_ACM////////////////////////////
5 c* T. n) n1 L3 S8 |  template
1 b$ V2 j& ^7 V5 }9 M* {  int bsearch(T c[],int n,T a)5 X. C% y9 n3 g; n
  {+ f- n( E! U! S) o% i) B3 i
  int l=1, r=n;: U$ o1 G" A1 T3 v- S  K9 n3 q
* _& I; L  p6 x- e
  while(l
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 21:57:00 | 显示全部楼层

2011年计算机等级考试二级C++辅导实例编程(27)

 {  int mid = (l+r)/2;
8 o# i% b  W8 x0 J, L3 s: B/ k1 R
  if( a > c[mid] && a &&= &&
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-9-28 02:01 , Processed in 0.256903 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表