ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

Educational DP Contest / DP まとめコンテスト P - Independent Set

問題
提出コード

解法

dp[i][c] = iを色cとしたとき(1:白、0:黒)の、根とする部分木の色の決め方
とします。
全体の根は1で固定します。
iの子をjとします。
すると、iを黒で塗るには、iの子jはすべて白でなければならないこと、iを白で塗る場合は、jの色は何色でもよいことを考えると、遷移は
dp[i][1] = \Pi (dp[j][1]+dp[j][0])
dp[i][0] = \Pi dp[j][1]
となります。
\Piは、\sumの乗算バージョンで、全ての積をとります。
あとは、うまーくiの子を拾っていくことができれば、dp[1][0] + dp[1][1]が答えになります。

感想

再帰をして、戻ってくるときに計算をするタイプ、あまり記憶がないので初めてかもしれません。
まずは、いつも通り幅優先か何かを行って計算することを考えましたが、iの子が数種類合った場合、そのさらに子にうつったときに、iの色をどちらにしたかという情報も必要になったりと、計算が複雑になり、時間内に解くことが難しそうでした。そこで、逆転の発想をして、幅優先探索を行い、葉から根に戻ってくる際に、計算を行っていくことにすれば、iの子のさらに子は、iとは無縁なので、うまく解くことができそう、という思考に至ります。あとは、iと、その子のjの関係を立式することができれば、この問題を解くことができます。