計算方法ではなく組み合わせ方法を使用して解決する可能性があります。しかし、あなたがstackoverflowを求めているので、私は計算上の解決策が必要だと思います。
i
で終わるパスの数を定義する漸化式があります:
P[N, 0, i] = 1 if i==0 otherwise 0
P[N, K, i] = 0 if i<0 or i>N
P[N, K, i] = P[N, K-1, i-1] + P[N, K-1, i+1]
我々は繰り返しi=0..N
のために、アレイP[N, K-1, i]
から与えられたK
ためi=0..N
ためP[N, K, i]
の配列を計算することができます。
これは、これを行うPythonコードです。それは0
を配列の最後に持つ小さなトリックを使用するので、r[-1]
とr[N+1]
は両方ともゼロです。
def paths(N, K):
r = [1] + [0] * (N+1)
for _ in xrange(K):
r = [r[i-1]+r[i+1] for i in xrange(N+1)] + [0]
return sum(r)
print paths(5, 3)
これはO(NK)時間で実行されます。 (i + 1、i)および(i、i + 1)に1からなる(N + 1)×(N + 1)の行列とすることである。 i = 0..N + 1であり、0は他の場所 - すなわち、サブ対角線および超対角に1である。次に、M^K
(つまり、M
がK
乗に上げられた)は、i
からj
までのパス数(i、j)をK
ステップで含んでいます。したがってsum(M^K[0,i] for i=0..N)
は、長さが0で始まるすべてのパスの合計数です。K
。これはO(N^3logK)時間で実行されるので、K
がN
よりはるかに大きい場合に限り反復方法よりも優れています。
あなたは、組み合わせで、この答えを更新してくださいすることができアプローチをしたり、そのための参照リンクをいくつか与えてください。私は両方のアプローチがどのように異なっているか理解できません(過去には決してできませんでした)。 –
より良い理解のため 'print paths(5、3)'の出力を投稿してください。 – user1735921
出力が '3' –