a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 41|回复: 0

[C语言] 最长公共子序列(1)

[复制链接]
发表于 2012-7-31 21:48:08 | 显示全部楼层 |阅读模式
最长公共子序列(1)* k4 X& O; d0 p+ B( y# B8 X- A# @
一、算法思想
- _5 u+ e' P0 N+ U5 ^( ~! K  一个给定序列的子序列是在该序列中删去若干元素后得到的序列。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X 和Y的公共子序列。最长公共子序列就是求给定两个序列的一个最长公共子序列。动态规划可以有效的解决此问题。由最长公共子序列问题的子序列的最优子结构性质,可以建立子问题最优的递归关系。用c[j]记录序列Xi和Yi的最长公共子序列的长度,递归关系如下:
% x/ k, H8 |4 W( i7 K. w# ?6 i+ l  0 i=0,j=0
. O$ G' i; t0 @8 l  c[j]= c[i-1][j][j-1]+1 i,j> 0;xi==yj
3 _* Z! [& D7 M3 {9 f9 C  @  max c[j-1],c[i-1][j] I,j> 0;xi==yj8 b; @# E, J; k* b
  在具体的算法设计中,以序列X= { x1,x2,x3,…,xm }和Y= {y1,y2,y3,…,ym}作为输入。输出三个数组c,b,temp。其中c[j]存储Xi和Yj的公共子序列的长度,b[j]记录c[j]的值是由哪一个子问题的解得到的,这在构造最长公共子序列时要用到。问题得最优解,即X和Y得最长公共子序列记录在temp[h]中。' e* j. o) S, n$ V' ~5 j8 W
  二、源代码
' U" C: |8 t% Z) p3 b  下面是在Microsoft Visual C++ 6.0中编写的求最长公共子序列的源程序,程序定义了最大得字符串长度为99,是将p48页的动态规划算法改写而来的。
, r' F) ~2 q7 v) ~) w. v  #include5 v6 K# e& t5 p% t7 ~+ I$ D9 }
  #include1 @: X7 m$ w( [' u+ B5 t
  #define MAX 99, F8 g* {6 @9 j0 ~' X' K- Q! g/ p' W3 `
  //typedef char MM;( H, f! ?0 G" F) @9 x
  void main()0 S; R# ~5 d2 h2 M9 b* m
  { int i,j,m,n,h=0;+ ^* ?8 F2 N" z+ Y+ M. @1 w
  char x[MAX]={ ' ', ' '},y[MAX]={ ' ', ' '},b[MAX][MAX]={ ' '};
3 W" n: \: q9 C' `: I" K0 g2 h  int c[MAX][MAX]={0};- @8 s! u1 I, f
  char temp[MAX]={ ' '};
8 g0 I# Q3 W, f# b+ T- `( z+ ]4 J  cout < < "**本程序可以求得字符数在99以内的任意两个字符串的最大公共子序列**\n ";
& I, G- X7 w' `+ a: G7 ?4 }  cout < < "请输入第一个字符串的长度m= ";+ U4 b  p- m9 G: o. x
  cin> > m;$ Y; `2 O3 P; x
  cout < < "请输入第一个字符串(“回车”结束)\n如果输入的字符数超过m,则会出错!\nx[ " </pp  for(i=1;i =m;i++)/pp  cin > x; //键盘输入x和y
# W) n8 t4 c$ D9 J) b& T# r  cout < < "请输入第二个字符串的长度n= ";
0 I; Y5 K4 s/ _8 ~" G3 P9 r  cin> > n;
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 02:54 , Processed in 0.273421 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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