scalaを使用して、次のcodechefの問題を解決しようとしています。問題文は以下の通り。
ハリー・ポッターの前に n 個の混合物が一列に並んでいます。各混合物には、100 の異なる色 (色には 0 から 99 までの数字があります) のいずれかがあります。
彼は、これらすべての混合物を混ぜ合わせたいと考えています。各ステップで、彼は隣り合った 2 つの混合物を取り、それらを一緒に混合し、得られた混合物をその場所に置きます。
色 a と b の 2 つの混合物を混合すると、結果の混合物は色 (a+b) mod 100 になります。
また、途中で煙が出ます。色 a と b の 2 つの混合物を混合したときに生成される煙の量は、a*b です。
すべての混合物を混ぜ合わせたときに、ハリーが得ることができる煙の最小量を調べてください。
提供される回答例は次のとおりです。
入力:
2 18 19 3 40 60 20
出力:
342 2400
2 番目のテスト ケースでは、次の 2 つの可能性があります。
first mix 40 and 60 (smoke: 2400), getting 0, then mix 0 and 20 (smoke: 0); total amount of smoke is 2400 first mix 60 and 20 (smoke: 1200), getting 80, then mix 40 and 80 (smoke: 3200); total amount of smoke is 4400
最初のシナリオは、生成される煙の量を最小限に抑えるため、正しいアプローチです。
これは動的プログラミングを使用して解決できることは理解していますが、この問題に取り組み、アルゴリズムを scala で表現するのに問題があります。
これが私がこの問題についてどのように考えているかです。ある種のルックアップ構造(配列、キーとしてTuple(Int、Int)を使用したマップ)で、2つの色を混合するために計算されたすべての値を保存します
これは、次の疑似コードで実現できます。
for(colors1<-1 through n)
for(colors2<-k through n)
if(color1 != color2)
//Check if color1,color2 combination exists as (color1,color2) or (color2,color1)
Map(color1,color2) = (color1+color2)%100
すべての初期色が計算されたら、生成された煙を考慮して、色を混合する順序を考慮する必要があります。これは私が問題を抱えているところです。生成される煙を最小限に抑えるサブ構造を策定しようとして、壁にぶつかっています。
ここでいくつかのガイダンスを得るのは素晴らしいことです。
ありがとう