最大公共子序列动态规划算法解法

来源:互联网 发布:云计算技术及应用专业 编辑:程序博客网 时间:2024/06/06 07:39
/* ============================================================================ Name        : studyc.c Author      : popo Version     : Copyright   : Your copyright notice Description : Hello World in C, Ansi-style ============================================================================ */#include <stdio.h>#include <dirent.h>#include <string.h>#include <errno.h>/*** 打印计算结果* **/ void printCLS(int m, int n, char *x, int **b,int w) {int i = 0, j = 0;printf("m=%d,n=%d\n", m, n);if( n<0 || m<0){return;}if (m == 0 && n == 0 ){if(*(b+(m-1)*w+n-1)==0){printf("%c ", x[0]);}return;}if (*(b+(m-1)*w+n-1) == 0) {printCLS(m - 1, n - 1, x, b,w);printf(" x[%d]=%c ", m-1,x[m-1]);} else if (*(b+(m-1)*w+n-1) == 1) {printCLS(m - 1, n, x, b,w);} else if (*(b+(m-1)*w+n-1) == -1) {printCLS(m, n - 1, x, b,w);}}void LCSLength(int m, int n, const char *x, const char *y, int max) {int i, j;int c[m][n];int bb[m][n];//计算x 与 y[0]的最长子序列值//初始化第一列c的值for (i = 0; i < m; i++) {//由于y[0]只有一个元素所以不管x中有多少个元素与y[0]相同c[i][0]总是等于1if (x[i] == y[0]) {c[i][0] = 1;bb[i][0] = 0;} else {if (i > 0) {c[i][0] = c[i - 1][0];bb[i][0] = 1;} else {c[i][0] = 0;bb[i][0] = -1;}}//printf("x[%d]=%c,y[0]=%c  c[%d][0]=%d\n", i, x[i], y[0], i, c[i][0]);}//由于x[0]只有一个元素所以不管y中有多少个元素与y[0]相同c[0][i]总是等于1for (i = 0; i < n; i++) {if (x[0] == y[i]) {c[0][i] = 1;bb[0][i] = 1;} else {if (i > 0) {c[0][i] = c[0][i - 1];bb[0][i] = -1;} else {c[i][0] = 0;bb[0][i] = 1;}};}for (i = 1; i < m; i++)for (j = 1; j < n; j++) {bb[i][j] = -2;//如果x[i]==y[j] 长度加1if (x[i] == y[j]) {c[i][j] = c[i - 1][j - 1] + 1;bb[i][j] = 0;} else if (c[i - 1][j] > c[i][j - 1]) {c[i][j] = c[i - 1][j];bb[i][j] = 1;} else {c[i][j] = c[i][j - 1];bb[i][j] = -1;}}for(i=0;i<m;i++)for(j=0;j<n;j++){printf("x[%d]=%c,y[%d]=%c  c[%d][%d]=%d b[%d][%d]=%d\n", i, x[i], j,y[j], i, j, c[i][j], i, j, bb[i][j]);}printCLS(m, n, x, bb,n);}int main(void) {char a[5];a[0] = 'm';a[1] = 'a';a[2] = 'd';a[3] = 'e';a[4] = 'c';char b[5];b[0] = 'a';b[1] = 'm';b[2] = 'e';b[3] = 'd';b[4] = 'c';LCSLength(5, 5, a, b, 5);printf("\n");return 0;}

原创粉丝点击