【发布时间】:2021-04-28 13:25:15
【问题描述】:
我正在尝试在c中实现最长公共子序列算法,矩阵c[][]存储最长公共子序列的长度,row[][]将父块行存储在c[][]矩阵中col[][] 存储父块列。
对于在解决 LCS 时采用这种非常不方便且效率低下的方法,我深表歉意,但是 什么都没有打印出来。请帮忙。
#include<stdio.h>
#include<stdlib.h>
void lcs(char *a,char *b,int i,int j)
{
int x,y,z;
int **c=(int **)malloc((j+1)*sizeof(int *));
for(x=0;x<j+1;x++)
{
*(c+x)=(int *)malloc((i+1)*sizeof(int));
*(*(c+x)+0)=0;
}
for(y=0;y<i+1;i++)
c[0][y]=0;
int **row=(int **)malloc((j+1)*sizeof(int *));
for(x=0;x<j+1;x++)
{
*(row+x)=(int *)malloc((i+1)*sizeof(int));
*(*(row+x)+0)=x-1;
}
for(y=0;y<i+1;y++)
row[0][y]=0;
row[0][0]=0;
int **col=(int **)malloc((j+1)*sizeof(int *));
for(x=0;x<j+1;x++)
{
*(col+x)=(int *)malloc((i+1)*sizeof(int));
*(*(col+x)+0)=0;
}
for(y=0;y<i+1;y++)
col[0][y]=y-1;
col[0][0]=0;
for(x=1;x<j+1;x++)
{
for(y=1;y<i+1;y++)
{
if(a[y-1]==b[x-1])
{
c[x][y]=c[x-1][y-1]+1;
row[x][y]=x-1;
col[x][y]=y-1;
}
else if(c[x-1][y]>
c[x][y-1])
{
c[x][y]=c[x-1][y];
row[x][y]=x-1;
col[x][y]=y;
}
else
{
c[x][y]=c[x][y-1];
row[x][y]=x;
col[x][y]=y-1;
}
}
}
for(x=0;x<j+1;x++)
{
for(y=0;y<i+1;y++)
printf("%d ",c[x][y]);
printf("\n");
}
printf("\n\n");
for(x=0;x<j+1;x++)
{
for(y=0;y<i+1;y++)
printf("%d,%d ",row[x][y],col[x][y]);
printf("\n");
}
}
void main()
{
char a[30]="papayaman";
char b[30]="papmn";
lcs(a,b,9,5);
}
【问题讨论】:
-
1)。安装调试器并学习如何调试你的程序——它将极大地提高你在未来解决类似问题的能力。 2)。这太复杂了,在发布之前简化代码是个好主意。 (或添加 cmets 描述您在每个块中所做的事情)。
标签: c algorithm dynamic-programming dynamic-memory-allocation longest-substring