2012-04-03 15 views
0

私は、n個のノードと高さkを持つすべてのバイナリツリーを数えるプログラムを書いています。すべてのノードに0または2の子があります。プログラムは機能しますが、答えはいくつかの特定のnとkについて常に同じであるため、いくつかのメモを追加したかったのです。構造体のC++多次元配列

私はペアの多次元配列を作成することができましたが、私はすでに私の便利な構造体を持っています。どのように私はこのmem変数を宣言して使用できますか?私はこれについて良い答えを見つけることができませんでした。私はポインタを理解するが、私はメモリ管理のない方法を好むだろう。

これはUSACOトレーニングプログラムbtwの練習問題です。

std::vector<std::vector<state> > mem; 

あなたがおおよそのサイズを知っていれば、あなたはそれを事前に割り当てることができますが、あなたが動的に(それに追加し、サイズを心配する必要はありませんすることができます:あなたはベクトルのvectorを使用することができます

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cmath> 
using namespace std; 

struct state { 
    int down, half; 
    state(int d, int h) : down(d), half(h) {} 
    int valid() { 
     return down != -1 && half != -1; 
    } 
}; 

state mem[200][100]; 

state cnt(int n, int k) 
{ 
    if (mem[n][k].valid()) 
     return mem[n][k]; 
    if (n == 1) 
     return state(k == 1, k != 1); 
    if (n > pow(2, k) - 1) 
     return state(-1, -1); 

    state total(0, 0); 
    for (int i = 1; i < n - 1; ++i) { 
     state left = cnt(i, k - 1); 
     state right = cnt(n - i - 1, k - 1); 

     if (left.valid() && right.valid()) { 
      total.down += left.down * right.down + 
          left.down * right.half + 
          left.half * right.down; 
      total.half += left.half * right.half; 
     } 
    } 

    return mem[n][k] = state(total.down % 9901, total.half % 9901); 
} 

int main() 
{ 
    ofstream fout ("nocows.out"); 
    ifstream fin ("nocows.in"); 

    int n, k; 
    fin >> n >> k; 

    for (int i = 0; i <= n; ++i) 
     for (int j = 0; j <= k; ++j) 
      mem[i][j] = state(-1, -1); 

    cout << cnt(n, k).down << endl; 

    return 0; 
} 

答えて

3

サイズ変更を避けるため)、またメモリクリーンアップは自動です。ベクターが有効範囲外になると、そのコンポーネントも削除されます。

stateのデフォルトのコンストラクタがないため、コードが機能しません。

事は、state mem[200][100];を書くと、コンパイラは100 * 200 stateオブジェクトを作成しようとしますが、できません。この作業を行うには、デフォルトのコンストラクタがstateにある必要があります。

struct state { 
    state() : down(0), half(0) {} //default constructor 
    int down, half; 
    state(int d, int h) : down(d), half(h) {} 
    int valid() { 
     return down != -1 && half != -1; 
    } 
}; 
+0

速い反応に感謝します。これは私が必要としたものですが、あなたや他の誰かがなぜ配列宣言が機能しないのか説明できますか? – Jasper

+0

@ジャスパーは私の編集で説明しました。 –

関連する問題