建築物の配列の安全性を証明するために[オファー]

タイトル説明

配列Aを与えられた[0,1、...、N- 1]、 配列B [0,1、...、N-構築してください 1]、 Bが要素B [I] = A [あり0] * A [1] * ... * A [I-1] * A [I + 1] * ... * A [N-1]。あなたは分裂を使用することはできません

分析:要求の対象は、除算を使用することができないことに注意してください!

我々は繰り返し動作を減らすためにレコードの配列を使用することができ、アクションが暴力に取られた場合、その後、繰り返し動作の多くがあるだろうことがわかりました

製品およびDPを記録するために2次元配列を使用してDPの代表は、インデックスjの積のインデックスiに[J] [i]は、後で計算する必要はもはや必要がある場合、それは直接使用できないように計算は、記録されてもよいした後、これは、法律のいわゆる覚書です

DPの配列の初期化の最初の

DP [0] [0] [0] =

DP [0] [I] = DP [0] [I-1] * [i]は、I> = 1、iがnを<

DP [N-1] [N-1]は[N-1] =

DP [i]は[N-1] DP [I + 1]〜[N-1] * [I]を=

状態遷移式:

いつ== 0、[i]はDPを= B [1]〜[N-1]、別個のヘッダ処理部

場合ときI == N-1、[I] DPを= B [0] [I-1]、尾単独治療

I iは[0] [I-1] * DP [I + 1]〜[N-1] [I] = DP B、N-1时を<> 0 &&

時間複雑:O(N)

宇宙複雑:O(N * N)

クラス解決
{ 
パブリック
    ベクトル < INT >乗算(constのベクトル< INT >&A)
    { 
        int型 N- = a.size();
         INTは [N-] DP [N-]; // DP [I] [J]:インデックスi要素インデックスjの積 
        のmemset(DP、0はsizeof0 )); 
        ベクター < INT > B(N、0 ); 
        
        //は初期化 
        DPは、[ 0 ] [ 0 ] [= 0 ;]
         のためにINT= I 1、I <N - 、Iは++ 
        { 
            DPは、[ 0 ] [I] DPは= [ 0 ] [I- 1 ] * A [I]; 
        } 
        DP N- [ - 1 ] [N- 1 ] [N-を= - 1 ];
         のためのint型 I = N- 2 ; I> = 0 ; i-- 
        { 
            DP [I] [N- - 1 ] DP = [I +は1 ] [N- 1。 ] * A [I]; 
        } 
        
        // 別のヘッダとトレーラ処理する必要がある
        ためint型 I = 0を; 私は、n <; 私は++ 
        { 
            場合(I == 0 
            { 
                B [i]は [= DP 1 [N-] 1 ]。
            } 
            他の 場合(I == N- 1 
            { 
                B [i]は DPを= [ 0 ] [I- 1 ]。
            } 
            
            { 
                B [i]は DPを= [ 0 ] [I- 1 ] * DP [I + 1 ] [N- 1 ]。
            } 
        } 
        戻りB。
    }
}。

おすすめ

転載: www.cnblogs.com/yinbiao/p/11596397.html