您的位置:首页 > 其它

算法导论 最长公共子序列的c程序实现带主函数

2016-05-09 22:57 113 查看
#include "stdio.h"

#include "stdlib.h"

int DPFindCommon(int x[], int y[], int m, int n, int **b);

void displayZ(int x[], int m, int n, int **b);

int main()

{

int i, m, n, j, q;

scanf("%d", &m);

scanf("%d", &n);

int **b = (int **)malloc(sizeof(int *) * (m + 1));

for(i = 0; i <= m; i++)

{

b[i] = (int *)malloc(sizeof(int) * (n + 1));

}

for(i = 0; i <= m; i++)

{

for(j = 0; j <= n; j++)

{

b[i][j] = 2;

}

}

int *x = (int *)malloc(sizeof(int) * m);

int *y = (int *)malloc(sizeof(int) * n);

printf("input x:");

for(i = 1; i <= m; i++)

{

scanf("%d", &x[i]);

}

printf("input y:");

for(i = 1; i <= n; i++)

{

scanf("%d", &y[i]);

}

q = DPFindCommon(x, y, m, n, b);

printf("len:%d\n", q);

displayZ(x, m, n, b);

return 0;

}

int DPFindCommon(int x[], int y[], int m, int n, int **b)

{

int i, j;

int **c = (int **)malloc(sizeof(int *) * (m + 1));

for(i = 0; i <= m; i++)

{

c[i] = (int *)malloc(sizeof(int) * (n + 1));

}

for(i = 0; i <= m; i++)

{

c[i][0] = 0;

}

for(i = 0; i <= n; i++)

{

c[0][i] = 0;

}

for(i = 1; i <= m; i++)

{

for(j = 1; j <= n; j++)

{

if(x[i] == y[j])

{

c[i][j] = c[i-1][j-1] + 1;

b[i][j] = 1;

}

else if(c[i][j - 1] > c[i - 1][j])

{

c[i][j] = c[i][j - 1];

b[i][j] = -1;

}

else

{

c[i][j] = c[i-1][j];

b[i][j] = 0;

}

//printf("(i: %d, j:%d, b[i][j]:%d) \n",i, j, b[i][j]);

}

}

return c[m]
;

}

void displayZ(int x[], int m, int n, int **b)

{

int i = 1, j = 1, k;

while(i <= m && j <= n)

{

//printf("(i: %d, j:%d, b[i][j]:%d)",i, j, b[i][j]);

if(b[i][j] == 1)

{

printf("%d\t", x[i]);

i++;

j++;

}

else if(b[i][j] == -1)

{

j++;

}

else

{

i++;

}

}

printf("\n");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: