最长公共子序列上下

时间:2020-06-29 11:37:54

标签: c++ output

#include <iostream>
#include <cstring>
using namespace std;

int LCS(string x, string y , int n , int m)
{
  int t[n+1][m+1];
  for(int i=0;i<=n+1;i++)
    for(int j=0;j<=m+1;j++)
    {
        if(i==0 || j==0)
            t[i][j]=0;
    }
  for(int i=1;i<=n+1;i++)
    for(int j=1;j<=m+1;j++)
    {
        if(x[i-1]==y[j-1])
            t[i][j]=1+t[i-1][j-1];
        else
            t[i][j]=max(t[i-1][j],t[i][j-1]);
    }
  return t[n][m];
}

int main()
{
    string x;
    string y;
    cin>>x>>y;
    LCS(x,y,x.length(),y.length());
    return 0;
}

o / p =进程返回0(0x0)执行时间:3.342 s 按任意键继续。

以下代码的o / p始终为零。 idk为什么。请帮忙。我在做什么错?

1 个答案:

答案 0 :(得分:0)

以下代码的o / p始终为零

因为您的主要确实:

...
LCS(x,y,x.length(),y.length());
return 0;

但是你想要:

...
return LCS(x,y,x.length(),y.length());

除此之外

 int t[n+1][m+1];

是可变长度的数组,请不要使用它们(请参阅Why aren't variable-length arrays part of the C++ standard?),而是在堆中动态分配数组,因为在编译时不知道大小,因此可以使用std::vector<std::vector<int>>,例如替换

 int t[n+1][m+1];
 for(int i=0;i<=n+1;i++)
   for(int j=0;j<=m+1;j++)
   {
       if(i==0 || j==0)
           t[i][j]=0;
   }

作者

  std::vector<std::vector<int>> t(n+1);
  
  for (int i = 0; i <= n; ++i)
    t[i].resize(m+1);

顺便说一句,您的循环是错误的,因为正确的测试到处都是i<=nj<=m