2014-10-04 64 views
0
#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; 
} 

這是用於計算將一個字符串轉換爲另一個字符串時的最小操作數的程序。用於將只允許操作是:int *轉換不允許int錯誤的原因是什麼?

1. Deleting a character 
2. Inserting a character 
3. Substituting a character 

現在,當我編譯這個程序,它顯示了錯誤:

從int無效的轉換*爲int [-fpermissive]

在我更新二維數組dp[i,j]的行中。爲什麼會發生?

+1

'int dp [len1] [len2];'其中'len1'和'len2'不是常量,** **無效**標準C++。 g ++支持這種語言擴展(從C99借用)。在C++中使用例如'的std :: VECTOR'。 – 2014-10-04 10:48:58

回答

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表示。

2
dp[i-1,j] 

這不訪問i-1第i行中的元素和j列。

括號內的表達式使用comma operator,其忽略i-1並且評估爲j。 所以表達式相當於dp[j],這當然是錯誤的; dp[j]引用的數組無法轉換爲int,並且出現上述錯誤消息,因爲編譯器試圖將數組衰減到指針並將該指針轉換爲int(這當然也不起作用)。你想寫dp[i-1][j]

+0

是的,明白了,謝謝。 :) – Qirohchan 2014-10-04 11:18:09

2

表格[i,j]儘管看起來類似於二維索引(就像在C#或Python中),但不幸的是,它與直覺相反:它使用comma operator。該運算符將評估所有表達式並返回最後一個表達式的結果作爲最終結果。所以,實際上你只需索引一次你的二維數組(dp[i-1,j]dp[j]),這會產生int*而不是int

改爲使用dp[i-1][j]

相關問題