从';int';至';int*'; 我想解决一个LCS问题(最长的公共子序列),我试图通过引用维基百科给出的解释和PASCAL代码来在C++中制作自己的代码。p>

从';int';至';int*'; 我想解决一个LCS问题(最长的公共子序列),我试图通过引用维基百科给出的解释和PASCAL代码来在C++中制作自己的代码。p>,c++,C++,我的最终结果是: #include <iostream> #include <algorithm> using namespace std; int LCS(int a[100], int b[100], int m, int n); int main() { int n, m, i, k, x[100], y[100]; cout << "n i m: " << endl; cin >> n >> m; cou

我的最终结果是:

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

int LCS(int a[100], int b[100], int m, int n);

int main()
{
 int n, m, i, k, x[100], y[100];
 cout << "n i m: " << endl;
 cin >> n >> m;
 cout << "n array: " << endl;
 for(i=1;i<=n;i++)
  cin >> x[i];
 cout << "m array: " << endl;
 for(i=1;i<=m;i++)
  cin >> y[i];
 k = LCS(x[100], y[100], m, n);
 cout << k << endl;
 return 0;
}

int LCS(int a[100], int b[100], int m, int n)
{
 int c[m][n], i, j;
 for(i=0;i<=m;i++)
  c[i][0] = 0;
 for(i=0;i<=n;i++)
  c[0][i] = 0;
 for(i=1;i<=m;i++)
 {
  for(j=1;j<=n;j++)
  {
   if(a[i] == b[j])
   {
    c[i][j] = c[i-1][j-1]+1;
   }
   else
    c[i][j] = max(c[i][j-1], c[i-1][j]);
  }
 }
 return c[m][n];
}

我并不真正喜欢c/c++编程,我想知道我的错误在哪里,为什么会发生,以及如何修复它。谢谢。

问题已经解决了

k = LCS(x[100], y[100], m, n);
换成

k = LCS(x, y, m, n);

问题是一致的

k = LCS(x[100], y[100], m, n);
换成

k = LCS(x, y, m, n);

LCS接受100整数的数组。您传递它一个int。这在C++中无效。顺便说一句,这只是这段代码中许多问题之一。举个例子,这是:

int c[m][n]

在C++中也是无效的。


如果您不熟悉一种语言,最好从小代码片段开始,一步一步地迭代构建。这是一种更好的获得理解的方法,而不是从另一种语言翻译一大块代码,然后祈祷它能够编译和工作。

LCS接受100个整数的数组。您传递它一个int。这在C++中无效。顺便说一句,这只是这段代码中许多问题之一。举个例子,这是:

int c[m][n]

在C++中也是无效的。


如果您不熟悉一种语言,最好从小代码片段开始,一步一步地迭代构建。这是一种更好的理解方法,而不是从另一种语言翻译一大块代码,然后交叉手指让它编译和工作。

只需传递数组名称即可

这个

不是这个

LCS(x[100], y[100], m, n);

只需传递数组名

这个

不是这个

LCS(x[100], y[100], m, n);
改变
k=LCS(x[100],y[100],m,n)
k=LCS(x,y,m,n)改变
k=LCS(x[100],y[100],m,n)
k=LCS(x,y,m,n)

应该是

 k = LCS(x, y, m, n);
您应该传入一个int数组,但实际上是传入索引为100的int

不过,我看到了一些其他的错误

for(i=1...
在C/C++中,数组的索引为0。对于(i=0

我 应该是

 k = LCS(x, y, m, n);
您应该传入一个int数组,但实际上是传入索引为100的int

不过,我看到了一些其他的错误

for(i=1...
数组在C/C++中的索引为0


i调用函数的代码混淆了:

k = LCS(x[100], y[100], m, n);

这将在第一个参数中传递x的第101个条目,在第二个参数中传递y的第101个条目。可能函数希望您传递数组的地址,因此它应该是
LCS(x,y,m,n)
您调用函数的代码混淆了:

k = LCS(x[100], y[100], m, n);
这将在第一个参数中传递x的第101个条目,在第二个参数中传递y的第101个条目。可能函数希望您传递数组的地址,因此它应该是
LCS(x,y,m,n)

在C/C++中,不能像这样在堆栈(或任何地方)上声明可变长度数组。您需要在堆上分配它们或使用恒定长度数组


在C/C++中,您不能在堆栈(或任何地方)上声明可变长度数组。您需要在堆上分配它们或使用恒定长度数组。

至少有一部分问题是这一行:

int c[m][n], i, j;
不能使用变量声明数组的大小。您需要执行以下操作:

int **c = new int[m][n];
然后最后,

int ret = c[m][n];
delete [][] c;
return ret;

至少部分问题在于这一行:

int c[m][n], i, j;
不能使用变量声明数组的大小。您需要执行以下操作:

int **c = new int[m][n];
然后最后,

int ret = c[m][n];
delete [][] c;
return ret;

k=LCS(x[100],y[100],m,n);
更改为
k=LCS(x,y,m,n);
k=LCS(x[100],y[100],m,n);
更改为
k=LCS(x,y,m,n);
作为旁注,尝试使用x[100]将是一个超出范围的整数。作为旁注,尝试使用x[100]C99标准允许可变长度数组,所以第一行是有效的。我不知道,结果MS Visual C++不支持它们。C99标准允许可变长度数组,所以第一行是有效的。我不知道这是因为MS Visual C++不支持它们。