动态规划法最长公共子序列代码c语言
时间: 2023-12-17 08:25:51 浏览: 105
动态规划最长公共子序列
这是一个使用动态规划法求解最长公共子序列的C语言代码。代码中使用了一个二维数组c[i][j]来存储a和b的前i个字符和前j个字符的最长公共子序列的长度。具体实现过程如下:
1. 首先输入A和B的长度n和m,以及两个字符串a和b。
2. 创建一个二维数组c[n+1][m+1],并将第一行和第一列初始化为0。
3. 从第二行和第二列开始,遍历整个二维数组,如果a[i-1]等于b[j-1],则c[i][j]=c[i-1][j-1]+1;否则,c[i][j]=max(c[i][j-1],c[i-1][j])。
4. 最后,c[n][m]即为a和b的最长公共子序列的长度。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
void lcs();
int max(int a,int b);
int main() {
lcs();
return 0;
}
int max(int a,int b) {
return a>b?a:b;
}
void lcs() {
int n,m,i,j;
char *a,*b;
printf("分别输入A和B的长度:");
scanf("%d%d",&n,&m);
a=(char *)malloc(n*sizeof(char));
b=(char *)malloc(n*sizeof(char));
int c[n+1][m+1];
printf("输入A字符串:");
scanf("%s",a);
getchar();
printf("输入B字符串:");
scanf("%s",b);
for(i=0;i<=n;i++)c[i]=0;
for(j=0;j<=m;j++)c[j]=0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(a[i-1]==b[j-1])
c[i][j]=c[i-1][j-1]+1;
else
c[i][j]=max(c[i][j-1],c[i-1][j]);
}
}
for(i=1;i<=n;i++) {
for(j=1;j<=m;j++) {
printf("%d ",c[i][j]);
}
printf("\n");
}
printf("\n%d\n",c[n][m]);
printf("按任意键继续\n");
}
阅读全文