我正在寻找解决LCS问题(最常见的子序列),我试图通过参考维基百科上给出的解释和pascal代码在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;
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];
}
我试图通过g ++编译它,我收到了一个错误:
3.cpp: In function 'int main()':
3.cpp:19: error: invalid conversion from 'int' to 'int*'
3.cpp:19: error: initializing argument 1 of 'int LCS(int*, int*, int, int)'
3.cpp:19: error: invalid conversion from 'int' to 'int*'
3.cpp:19: error: initializing argument 2 of 'int LCS(int*, int*, int, int)'
我不是真正参与c / c ++编程,我想知道我的错误在哪里,为什么会发生以及如何解决它。谢谢。
答案 0 :(得分:8)
只需传递数组名称。
此
LCS(x, y, m, n);
不是这个
LCS(x[100], y[100], m, n);
答案 1 :(得分:5)
将k = LCS(x[100], y[100], m, n);
更改为k = LCS(x, y, m, n);
。
答案 2 :(得分:2)
问题在于
k = LCS(x[100], y[100], m, n);
将其更改为
k = LCS(x, y, m, n);
答案 3 :(得分:2)
调用该函数的代码混淆了:
k = LCS(x[100], y[100], m, n);
它在第一个参数中传递x的第101个条目,在第二个参数中传递y的第101个条目。据推测,该函数希望您传递数组的地址,因此它应该是LCS(x, y, m, n)
。
答案 4 :(得分:1)
将k = LCS(x[100], y[100], m, n);
更改为k = LCS(x, y, m, n);
。
答案 5 :(得分:0)
LCS接受100个整数的数组。你传递一个int。这在C ++中无效。顺便说一句,这只是本代码中的众多问题之一。举个例子,这个:
int c[m][n]
在C ++中也无效。
如果您不熟悉某种语言,那么从小代码片段开始逐步构建迭代是一种很好的做法。这是获得理解的一种更好的方式,而不是从另一种语言翻译大量代码,只需交叉手指即可编译和工作。
答案 6 :(得分:0)
k = LCS(x[100], y[100], m, n);
应该是
k = LCS(x, y, m, n);
你应该传入一个int数组,但是你传入的是索引为100的int。
我还看到了其他一些错误。
for(i=1...
数组在C / C ++中的索引为0。 for(i = 0 ...
我&lt; = n应该是我
对于输入n和m的用户,您没有对数组的边界进行任何错误检查。如果用户供应150 - 你崩溃了。
答案 7 :(得分:0)
int LCS(int a[100], int b[100], int m, int n)
{
int c[m][n], i, j;
...
你不能在C / C ++中的堆栈(或任何地方)声明可变长度数组。您需要在堆上分配它们或使用常量长度数组。
答案 8 :(得分:0)
问题的至少一部分是这一行:
int c[m][n], i, j;
您不能使用变量来声明数组的大小。您将需要执行以下操作:
int **c = new int[m][n];
然后在最后,
int ret = c[m][n];
delete [][] c;
return ret;