/*
============================================================================
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]总是等于1
if (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]总是等于1
for (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] 长度加1
if (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;
}