私は Project Euler の問題に取り組んできましたが、ほとんどの場合、うまくやっています。問題18ですが、本当に困惑しました。
木のてっぺんから始めて、最大の合計につながるパスを見つけることになっています
3
7 4
2 4 6
8 5 9 3
この場合、24 の可能なパス、つまり 4 つがあります。最適なパスは3 -> 7 -> 4 -> 9で、合計すると 23 になります。
例を複製して問題を解決しようとしました。
array = [[3],[7,4],[2,4,6],[8,5,9,3]]
array.each_slice(1){|s|p s} => This prints the tree
まれに正しい回答が得られましたが、実際には正当ではありません。
sum = []
array.each{|a|sum.push(a.sample)}
return sum
この方法は、基本的にはランダムなパスを選択するだけであり、この簡単な例でも、24 分の 1 の確率で正しいパスが得られるだけです。
私は次のようなことを試しました
level_two = []
level_three = []
for i in 0..array.length-1
for j in 0..array[1].length-1
level_two.push([array[0], array[1][i]) => Now level 2 has 2 paths - [3,7] & [3,4]
for k in 0..array[2].length-1
level_three.push([level_two[0],array[2][k], [level_two[1], array[2][k])
end
end
end
しかし、この時点では、使用している変数を追跡することさえできません。
each_cons、combination、zip を試しましたが、どれもうまくいきませんでした。
この問題を解決するための戦略を知っている人はいますか?
編集:これは問題に対する答えではなく、単に例に対する答えです。次に、その設計パターンを主な問題に適用します。