首页 > 编程知识 正文

动态规划算法的基本步骤,最长子序列问题

时间:2023-05-06 14:52:08 阅读:136032 作者:4034

最长公共子序列问题:

给定数组X={x1,x2,xm},则另一数组Z={z1,z2,zk}表示x的子数组存在严格递增的下标数组{i1,i2,ik}

给定两个序列x和y,如果另一序列z是x的子序列和y的子序列,则称z为序列x和y的公共子序列。 给定两个序列X={x1,x2,xm}和Y={y1,y2,yn},找出x和y的最长公共子序列。

# include stdio.h # include string.h # define maxlen 100 voidlcslength (char * x,char *y,int m,int n,intc [ ] ) for (I=i=m; I ) c(I ) )0)=0; (for ) j=1; j=n; j({c[0][j]=0; (for ) I=1; i=m; I ) for(j=1; j=n; j () if ) x[I-1]==y[j-1] ) { c[i][j]=c[i-1][j-1] 1; //c[i][j]来源于前一行的前一列,即(( b[i][j]=0)。 }elseif(c[I-1][j]=c[I][j-1] ) { c[i][j]=c[i-1][j]; //c[i][j]来源于前一行的前一列,b[i][j]=1; }else{ c[i][j]=c[i][j-1]; //c[i][j]来源于前一行的前一列。 b[i][j]=-1; }}}voidprintLCS(intb[][maxlen],char *x,int i,int j ) if(I==0|||j==0) { return; (if ) b ) I ) j )==0) printLCS ) b、x、i-1、j-1 ); printf('%c ',x[i-1] ); }elseif(b[I][j]==1)打印LCS ) b,x,i-1,j ); }else{printLCS(b,x,I,j-1 ); }}void main () { char x[MAXLEN]; char y[MAXLEN]; int b[MAXLEN][MAXLEN]; int c[MAXLEN][MAXLEN]; int m,n; printf ('输入第一个字符串:n ); gets(x; printf (输入第二个字符串:n ); gets(y; m=Strlen(x; n=Strlen(y; LCSLength(x,y,m,n,c,b ); printf ('最长的公共子序列是'); printLCS(b,x,m,n ); getchar (; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。