最长的公共子序列自上而下

Longest Common Subsequence top-bottom

本文关键字:自上而下      更新时间:2023-10-16
#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 始终为零。 为什么。 请帮忙。 我做错了什么?

以下代码的 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];

是一个可变长度数组,请不要使用它们(请参阅为什么可变长度数组不是C++标准的一部分?(,而是在堆中动态分配的数组,因为在编译时大小是未知的,您可以使用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<=n并且到处都是j<=m