これは宿題の問題のようにひどくにおいがします。講師または TA と会うことをお勧めします。これは、インタラクティブに学習するのに最適な種類のものだからです。この情報を使用する場合は、盗用を避けるために必ず引用してください。
まず、結果が値で線形であることを観察します[a0, a1, ... aN]
。したがって、実際にはそれらの係数を追跡するだけで済みます。{b1, b2, ..., bN}
表記上の目的で、 represente と書きましょうb1 * a1 + b2 * a2 + ... bN * aN
。
次に、いくつかの再帰を手作業で計算します。
f([a1, a2], a, 2) = { 1/2, 1/2 }
の基本ケースですN=2
。
見てみましょうN=3
:
f([a1, a2, a3], a, 3)
偶数a
= .{1/2, 0, 1/2} + { f([a1, a2], a+1, 2)/2, 0 } + { 0, f([a2, a3], a+1, 2)/2 } = { 1/2, 0, 1/2 } + { 1/4, 1/4, 0 } + { 0, 1/4, 1/4 } = { 3/4, 1/2, 3/4 }
f([a1, a2, a3], a, 3)
a
奇数 =の場合{ f([a1, a2], a+1, 2)/2, 0 } + { 0, f([a2, a3], a+1, 2)/2 } = { 1/2, 0, 1/2 } + { 1/4, 1/4, 0 } + { 0, 1/4, 1/4 } = { 1/4, 1/2, 1/4 }
。
今N=4
:
f([a1, a2, a3, a4], a, 4)
偶数a
= . は偶数な{ 1/2, 0, 0, 1/2 } + { f[a1, a2, a3], a+1, 3)/2, 0 } + { 0, f([a2, a3, a4], a+1, 3)/2 }
のでは奇数なので、 の場合です。偶数= .a
a+1
F([], even, 3)
f([a1, a2, a3, a4], a, 4)
a
{ 1/2, 0, 0, 1/2 } + { 1/8, 1/4, 1/8, 0 } + { 0, 1/8, 1/4, 1/8 } = { 5/8, 3/8, 3/8, 5/8 }
f([a1, a2, a3, a4], a, 4)
a
奇数 =の場合{ f[a1, a2, a3], even, 3)/2, 0 } + { 0, f([a2, a3, a4], even, 3)/2 } = { 3/8, 1/4, 3/8, 0 } + { 0, 3/8, 1/4, 3/8 } = { 3/8, 5/8, 5/8, 3/8 }
。
これで、係数が偶数か奇数N
かのみに依存することがわかります。a
これは、動的計画法でN
と ブール値の各組み合わせの係数を記憶するだけでよいことを意味します。の上限は 2000 であるためN
、必要なエントリは 4000 だけで、それほど負担にはなりません。実際、再帰を放棄して、上記のように単純にテーブル全体を段階的に計算することもできます。