算法导论 最长公共子序列的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");
}
#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");
}
相关文章推荐
- linux基础(14)--输入输出重定向、文件查找--RHEL6.5
- Android 开发入门之《第一行代码》(1)
- java 线程四
- c++实验5-求和
- 用JAVA实现一个爬虫,爬取知乎的上的内容
- Spring IOC容器-注解的方式【更简化】
- 用vscode写博客和发布
- CDOJ 1325 卿学姐与基本法 (离散化+区间修改)
- textview删除线
- java 线程三
- linux下面mongodb的安装
- 《java入门第一季》之类StringBuffer类初步
- Android播放声音文体
- 《java入门第一季》之类StringBuffer类初步
- GeekBand C++面向对象高级编程(上)一
- CTF中的EXP编写技巧 zio库的使用
- 第2章 面向对象的设计原则(SOLID):3_依赖倒置原则(DIP)
- XML-RPC 简单理解与博客园的MetaWeblog协议
- java 线程二
- Struts2标签取值方式一/二