タイトル説明
配列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、はsizeof(0 )); ベクター < 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。 } }。