2011-06-21 5 views
1

こんにちは私は最小一般的なサブシーケンス問題のプログラムを書いている、2次元論理に詰まった

2次元配列渡しと横断で立ち往生。親切に助けてください。

以下はコードです。私が合格する/ 2次元の配列を横断バックトラック内ことはできませんよと私は基本的に親切に助けて... lcs_lengthからバックトラック機能を()の呼び出しで

を立ち往生しています

void backtrack(char x[], char y[], int L[][7], int m, int n) 
{ 
    if(m == 0 || n == 0) 
    return; 

    else if(x[m-1] == y[n-1]) 
    { 
    backtrack(x, y, L, m-1, n-1); 
    cout << x[m-1] << " "; 
    } 

    else 
    { 
    if(L[m-1][n] > L[m][n-1]) 
     backtrack(x, y, L, m-1, n); 
    else 
     backtrack(x, y, L, m, n-1); 
    } 
} 


int lcs_length(char x[], char y[], const int m, const int n) 
{ 
    int L[m+1][n+1]; 

    for(int i=0; i<=m; i++) 
    {  
    for(int j=0; j<=n; j++) 
    {   
     if(i == 0 || j == 0) 
     L[i][j] = 0;    

     else if (x[i-1] == y[j-1]) 
     L[i][j] = L[i-1][j-1] + 1; 

     else    
     L[i][j] = max (L[i-1][j], L[i][j-1]); 
    }   
    }  
    backtrack(x, y, L, m+1, n+1); 
    return L[m][n]; 
} 



int main(int argc, char *argv[]) 
{ 
    char x[] = "ABCDGH"; 
    char y[] = "AEDFHR"; 

    int m = sizeof x/sizeof *x; 
    int n = sizeof y/sizeof *y; 

    cout << lcs_length(x, y, m, n); 

    return EXIT_SUCCESS; 
} 

..

ありがとう。

+2

'int m = sizeof x/sizeof * x;という行は何ですか? int n = sizeof y/sizeof * y; 'これは意図したものですか? –

+0

int m = sizeof x/sizeof * x; int n = sizeof y/sizeof * y; >>は文字列x、yの長さを計算します。 g ++コンパイラで実行されます.. – AGeek

+0

あなたはC++を使用していますが、依然としてCスタイルの配列を使用していますか?あなたはできるだけ早くベクトルに切り替える必要があり、あなたの人生を楽にします。そしてあなたが持っている問題をまったく解決しないでください。 – LiKao

答えて

1

変数を使用して要素の数を設定するため、lcs_lengthの2次元配列Lは実際のc配列ではありません。例えばそのサイズを設定するとき。 int L[100][7]にすべて正常に動作します。

しかし、私はむしろ、例えば、実際の動的配列を使用することになり、あなたの問題を解決するために:

int **L = new int* [m+1]; 
for (int i = 0; i < m+1; i++) 
    L[i] = new int[n+1];

次にあなたがint ** Lとして配列を渡すことができます。

関連する問題