2
私は練習問題からShopping Plan problemを参照しています。ここにthe solutions pageへのリンクがあります。誰かがこのGoogle Code Jamの問題を解決するアルゴリズムの1つを説明できますか?
私は練習問題からShopping Plan problemを参照しています。ここにthe solutions pageへのリンクがあります。誰かがこのGoogle Code Jamの問題を解決するアルゴリズムの1つを説明できますか?
解決策を見ることなく、これは標準DPのように見えます。各状態は、アイテムのリストで表される
は、(= 51
可能なオプションを50
格納+ 1
原位置)(2^15
組み合わせ)を購入し、車の現在位置に残しました。
ある状態から他の状態への遷移は簡単です。
def minCost(itemsLeft, currentPosition)
current_minimum = INFINITY
for (each store in the list) {
if (store.containsSomeOf(itemsLeft)) {
candidate = minCost(itemsLeft - store.items, store)
+ cost_of_items_bought_at_store + cost_of_driving
current_minimum = min(current_minimum, candidate)
}
}
return current_minimum
end
当然、itemList
はビットマスクではなく、実際のリストとして表されます。
傷みやすいアイテムも考慮する必要がありますが、それはまったく技術的なものです。
最後に、再帰にmemoizationを適用するか、純粋なDPとして書き直す必要があります。
これはまさに私がやったことですが、それは小さな問題のセットではうまくいきますが、大きなものではまったく動作しません。もちろん、低レベルは最適化されていません。私は、インテグレーションを処理するためにカスタムデータ構造を使用することができるセットをたくさん使用しています。私はトップソリューションがC/++で書かれていることを知っていますが、どの程度の非効率性が言語に由来しているのか、そして低レベル実装の詳細からどれくらいのものがあるのでしょうか。 –
ripper234
@ ripper234 'Set'を使っているのなら、それは言語の誤りではありません:) 'new int [1 << 15] [51]'のような配列を使って結果を記憶できます。 –