アイデアは、各行のサブインターバルが両方のプレーヤーの合計を格納することです。
間隔F(start, end)
でプレーする最初のプレーヤーの可能な合計を示すとします[start, end]
。同様の define S(start, end)
。のように、和の確率とともに可能な和を辞書に格納でき{2: 0.25, 5: 0.25, 6: 0.5}
ます。
再帰が保持するよりも:
F(start, end) = {row[end] +sum: p/2, for sum,p in S(start, end-1)} +
{row[start]+sum: p/2, for sum,p in S(start+1, end)}
S(start, end) = {sum: p/2, for sum,p in F(start, end-1)} +
{sum: p/2, for sum,p in F(start+1, end)}
F(start, end) = {row[start]: 1} if start == end
S(start, end) = {} if start == end
これは、間隔の長さを増やすことで計算できます。
for length = 0 to row_length-1:
for start = 1 to row_length - length:
calculate `F(start, start+length)` and `S(start, start+length)`
辞書F(1, row_length)
とS(1, row_length)
は、期待される合計を計算するために使用されます。