AOJ DP libraryメモ

http://judge.u-aizu.ac.jp/onlinejudge/topic.jsp?cid=DPL
とりあえず、典型DPと呼ばれるであろう問題を一通り解く。
考えが違っていた部分をメモ。

Combinatorial A. Coin Changing Problem

dp[i][j]と置くとき、i-1からi方向しか考えない場合が多かったけど、「無限個使える」場合は、forループが1つ増えてしまう。
j-1までも計算済みであることを使えばループを減らせる。

Combinatorial B. 0-1 Knapsack Problem

Combinatorial C. Knapsack Problem

Coin + 0-1 Knapsack。

Combinatorial D. Longest Increasing Subsequence

LISはdpテーブルの持ち方をABCで見ていた。
dpテーブルの探索が必要な場合、dpテーブル自体のデータ構造も変更する必要がでてくる。

Combinatorial E. Edit Distance (Levenshtein Distance)

Permutation/Path A. Traveling Salesman Problem

bitDPで、dp[S][i][j]:=すでに訪れた頂点集合Sで、最初にスタートした頂点iと今いる頂点j、というテーブルでまとめて計算したけど、スタートする頂点ごとにV回計算しても同じなので、メモリがきついときはdp[S][j]で通せる。

Permutation/Path B. Chinese Postman Problem

有向グラフだと思ってずっと考えてたけど、無向グラフだった。。
すべての辺は1度以上通る、偶数次数と奇数次数の頂点数、奇数次数の処理、の考察が必要。
重み付き完全グラフの最小マッチングはbitDPで、TravelingSalesmanと同じ集合処理。

Pattern A. Largest Square

dp[i][j]を考える時、dp[i-1][j-1]と縦方向・横方向の空いているマス目が必要だと思って書いたけど、縦方向、横方向はdp[i-1][j]とdp[i][j-1]にも情報として含まれているので、それを使うことができる。

Pattern B. Largest Rectangle

ヒストグラム最大長方形問題。長方形の候補がたくさんでてくるのでうまく保持する必要がある。
j'から伸び続けている長方形でj時点でその長方形がさらに伸ばせるか?、j-1で終わりか?をうまく保持できればよい。stack。