Problem G

Problem G: Philosopher’s
stone
で、
• Accept:0
• Submit:0
– まぁ、妥当かと・・・。
概要
• 賢者の石を最短時間でつくれ
• 与えられるもの
– レシピ:
•
•
•
•
出来上がるもの
必要なものとその個数
かかる日数
同じものを作るのに複数のレシピはない
– 材料
• 種類と個数
• できるなら最小日数を出力。できないとimpossible
– できる場合合成回数は15回まで
• キャッシュ付き全探査で求まる範囲
– 同時にできる作業は2つまで
解法概要
• レシピがユニークなので、作らなければいけないも
の&その個数は簡単に判定可能
– トポロジカルソートをかけて上位から探索
– Impossibleはこの段階で判定可能
• どういう順でつくるかはわからない
• 探索木はDAG
• 作れる場合はDFS
– 枝刈りとメモ必須
トポロジカルソート
• DAG(循環のない有向グラフ)を、親子関係を
崩さないまま全順序化する
– AがBの祖先→Bのindex < Aのindex
A
たとえば
B
C
G
D
E
G
F
H
D
B
E
H
F
C
A
トポロジカルソートのアルゴリズム
• DFSで帰りがけ順にリストに追加
Impossibleの判定
• トポロジカルソートをかけて、上位から
(Philosopher’s-stoneから)生成に必要な個
数を数える。
• 手持ちがあったらその数分使う。
• レシピがなくて、必要数手持ちにない場合は
impossible
作れる場合(その1)
•
トップダウン型
•
メモ付き枝狩り全探査
– 作られなきゃいけないものから逆にたどる
– メモ化
• 単純全探査では最悪15!程度になるのでおわらない
• A→B→・・・とB→A→・・・との探索の後ろは同じ
• メモの状態:
–
–
–
–
今必要となるものの集合
現在の時刻
現在作っているもの、終了時刻
手持ちの材料と個数
– 枝狩り
• 今の最短時間よりも時間がかかることがわかった時点でreturn
• 手持ちはとりあえず使ってみる
– 使わない場合も探索必須
• レシピがないものは手持ちから使うしかない
•
記述量がかなり増えるけど、残りは単なる実装
作れる場合(その2)
• ボトムアップ型
– 探索の状態は時刻+今作っているもの+残りの
材料+残りレシピ
– 各状態より作れるものを作ったのが次の状態
– 後は記述が多少面倒な探索問題