#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int minimu ( int a, int b, int c );
int main (void)
{
int t,i,j;
cin>>t;
while ( t != 0 )
{
string a;
string b;
cin>>a>>b;
int k;
int len1 = a.length();
int len2 = b.length();
int dp[len1][len2];
dp[0][0] = 0;
for ( i = 0; i < len1; i++ )
{
dp[i][0] = i;
}
for ( j = 0; j < len2; j++ )
{
dp[0][j] = j;
}
for ( i = 1; i < len1; i++ )
for ( j = 1; j < len2; j++ )
{
if ( a[i] == b[j] )
k = 2;
else
k = 0;
dp[i][j] = minimu(dp[i-1,j]+1,dp[i,j-1]+1,dp[i-1][j-1]+k);
}
cout<<dp[len1-1][len2-1]<<"\n";
t--;
}
return 0;
}
int minimu ( int a, int b, int c )
{
int foo = min(a,min(b,c));
return foo;
}
这是用于计算将一个字符串转换为另一个字符串时的最小操作数的程序。唯一允许的转换操作是:
1. Deleting a character
2. Inserting a character
3. Substituting a character
现在,当我编译这个程序时,它显示错误:
从int *无效转换为int [-fpermissive]
在我更新二维数组dp[i,j]
的行中。为什么会这样?
答案 0 :(得分:5)
由于声明:
int dp [len1] [len2];
dp[i-1,j]
是数组,而不是矩阵的元素。 (此处comma operator
可能会引起混淆,正如 @BartoszKP 所解释的那样。)
也许
minimu(dp[i-1,j]+1,dp[i,j-1]+1,dp[i-1][j-1]+k);
应该是
minimu(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+k);
// ^ ^
P.S。请注意,根据C ++标准,非常规尺寸的int dp[len1][len2];
无效,因为 @Cheers和hth 表示。
答案 1 :(得分:2)
dp[i-1,j]
这不会访问i-1
行和j
列中的元素。
括号内的表达式使用忽略i-1
的{{3}}并计算为j
。
所以表达式相当于dp[j]
,这当然是错误的; dp[j]
引用的数组无法转换为int
,并且上面的错误消息出现,因为编译器试图将数组衰减为指针并将该指针转换为int
(这当然也不起作用。)
你打算写dp[i-1][j]
。
答案 2 :(得分:2)
表单[i,j]
的表达式,即使它看起来类似于二维索引(比如在C#或Python中),但遗憾的是它不符合直觉:它使用comma operator。此运算符将评估所有表达式并返回最后一个表达式的结果作为最终结果。因此,实际上您只需将您的2D数组编入索引一次(dp[i-1,j]
〜dp[j]
),这会产生int*
而不是int
。
改为使用dp[i-1][j]
。