競プロ日和

競技プログラミングを楽しむ

AtCoder Educational DP Contest / DP まとめコンテスト F - LCS

dp_f

蟻本の最長共通部分列問題の類題?

最後に共通部分文字列を出力する必要があり、それに手間取った。

共通文字が存在するときはその要素の右下が1大きくなるので、逆に辿れば共通部分文字列の反転を得られる。それを反転して出力すればいい。

計算量がO(|s||t)で 9 * 106 のため、pythonでは制限時間内に間に合わせるのが難しかったので、c++で提出した。

一応pythonコード

c++コード

AtCoder Educational DP Contest / DP まとめコンテスト E - Knapsack 2

dp_e

動的計画法

蟻本p60の01ナップサック問題その他2の類題?

O(nW)では 1011 となり、配列が長すぎてしまうため、工夫。

重さではなく、価値の配列にすれば、O(nv)で 107となり、計算可能になる。

pythonでは間に合わなかったため、c++で提出した。

一応、pythonコード

c++コード

AtCoder Educational DP Contest / DP まとめコンテスト D - Knapsack 1

dp_d

動的計画法

通常のナップサック問題

重さが 105 なので、O(NW)では 107

pythonでは間に合わなかったため、c++で提出した。

一応、pythonコード

c++コード

AtCoder Educational DP Contest / DP まとめコンテスト C - Vacation

dp_c

動的計画法

現時点をiとし、aについて考える。

現在のa[i]を最大にするには、

a[i]に1つ前のa以外(b、またはcのうち大きいほう)を合計すればいい。

b,cについても同様。

そして、最終的に最大なものを出力。

AtCoder Educational DP Contest / DP まとめコンテスト B - Frog 2

dp_b

動的計画法

前問のAの範囲が2つ前までだったのに対し、今回はKつ前までとなる。

問題自体は難しくないが、普通に解くと計算量がO(nk)となり、pythonでは間に合わない(numpy使って工夫しないかぎり)。

一応、pythonコード

c++コード