【问题标题】:Longest Common Subsequence not printing length matrix最长公共子序列不打印长度矩阵
【发布时间】: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


【解决方案1】:

也许可以这样简化:

迭代版本(自下而上)

    int lcs(char * A, char * B)
    {
        allocate storage for array L;
        for (i = m; i >= 0; i--)
             for (j = n; j >= 0; j--)
             {
              if (A[i] == '\0' || B[j] == '\0') L[i,j] = 0;
              else if (A[i] == B[j]) L[i,j] = 1 + L[i+1, j+1];
              else L[i,j] = max(L[i+1, j], L[i, j+1]);
             }
        return L[0,0];
      }
====================================================

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2011-03-01
    相关资源
    最近更新 更多