マツシタのお勉強

動的計画法

隣接する要素は盗めない泥棒 House Robber in LeetCode 動的計画法

問題 N個の整数を持つ配列が与えられる。隣接する要素は取れないという条件で、各要素の和の最大を求める問題。 例 [1, 2, 3, 4, 5] という配列の場合は以下のようなとり方がある 1 , 3, 5 → 9 1, 4 → 5 1, 5 → 6 2, 4 → 6 2, 5 → 7 max = 9 leetcode.com 解…

DP: Coin Change in Hack Rank

問題 N枚の異なるコインと支払いたい金額moneyが与えれる。与えられたコインはそれぞれ無限に使える時、与えられたコインを使って合計金額がmoneyとなるような支払い方法の通り数を求める問題。 www.hackerrank.com 解法 動的計画法と用いることで計算量O(N*…

動的計画法を用いて階段の登り方の通り数求める Davis' Staircase in Hacker Rank

問題 始め階段の0段目にいて、N段目までの登り方の方法の数を求める問題。 階段は1段、2段又は3段を一気に登る事ができる。 www.hackerrank.com 解法 全列挙するためには、今いる段から1段登るか2段登るか3段登るかの3通りを毎回行うので、3N通り行…

AtCoder ABC057 D - Maximum Average Sets

問題 D: Maximum Average Sets - AtCoder Beginner Contest 057 | AtCoder N(1 <= N <= 50)個の品物が与えられ、それぞれの品物には価値Vi(1 <= i <= N)が設定されている。A個以上、B以下の品物を取ることが出来る時、選択した品物の価値の最大の平均値と、…

AtCoder ABC D - Mixing Experiment

問題 D: Mixing Experiment - AtCoder Beginner Contest 054 | AtCoder 解き方 全列挙を考える 全列挙する場合、i番目の薬品を購入する場合としない場合を2パターンをN回行うので、計算量はO(2N)となりNは最大40なので間に合わない。 動的計画法を使う dp(i…

361. Bomb Enemy : Past Google Coding Interview

Problem https://leetcode.com/problems/bomb-enemy/ How to Solve This problem can be solved by using Dynamic Programming. The point of this problem is that one spot in the grid can divide into four direction (up, down, left, right). We can c…

漸化式を立てて「tree DP問題」を解く D - 塗り絵

問題 D: 塗り絵 - AtCoder Beginner Contest 036 | AtCoder N 個の島があります。 島には 1 から N までの番号がついています。 また、N−1 個の橋があります。 i 番目の橋は ai 番の島と bi 番の島をつないでいます。 どの島からどの島へも橋をいくつか経由…

AtCoder ABC027 D - ロボット

問題 D: ロボット - AtCoder Beginner Contest 027 | AtCoder 部分点解法 部分点解法は動的計画法を用いた解法となる。 文字列を1文字ずつ辿る。'M' の時に「右に行く場合」と「左に行く場合」の2パターンで分木していく。すると以下のような木構造となる…

ナップザンク問題

dp(i, j)を以下のように定義する。 dp(i, j) := i番目の荷物を重さj以下のなるように操作した時(その荷物を入れるか否か)の最大の価値 深さ優先で、その荷物を入れる場合と入れない場合とを比べ、価値がより大きくなるものを選択していく。

ドワンゴからの挑戦状 B - ニコニコレベル

問題 B: ニコニコレベル - 第3回 ドワンゴからの挑戦状 予選 | AtCoder ニコニコ文字列とは、25 を 0 回以上繰り返した文字列のことをいいます。たとえば 25 や 252525 や空文字列はニコニコ文字列ですが、123 や 225 はニコニコ文字列ではありません。 ある…

重複組合せを用いた多重ループ

問題 D: 多重ループ - AtCoder Beginner Contest 021 | AtCoder 解法 問題文の以下に注目 このプログラムの出力する答えは 1≦a1≦a2≦…≦ak≦n であるような整数の組 (a1,a2,…,ak) の個数に等しい 公式の解説に則ってこの文章を以下のように変換して考える。 「…

AtCoder ABC D: 経路

問題 D: 経路 - AtCoder Beginner Contest 037 | AtCoder 解法 以下をポイントにして動的計画法により解く。 求めたいもの: 経路数 マスを進む度に変わるもの: (i, j) 現在いるマスがi行j列のマス 進めるマスが無くなったらを抜ける条件にして再帰関数で実装…

トポロジカルソートの組合せを数え上げる

問題 D: 徒競走 - AtCoder Beginner Contest 041 | AtCoder 与えられたDAGをトポロジカルソートしてできる列の通り数を数え上げる問題。普通にトポロジカルソートすると1つの列しか作成されない。 また、全列挙(全てのノードの順列をだし、全ての有効辺を満…

最長共通部分列 Longest Common Subsequence

最長共通部分列とは 最長共通部分列(Common Longest Subsequence)とは、2つの与えられてた列X = {x1, x2, …, xm}とY = {y1, y2, …, yn}の最長の共通部分列のことである。 例えばX = {a, b, c, d, f}, Y = {a, f, b, d, a}の最長共通部分列は{a, b, d}となる…

フェルマーの小定理による組み合わせ計算によって経路数を数え上げる

問題 D: いろはちゃんとマス目 / Iroha and a Grid - AtCoder Beginner Contest 042 | AtCoder 解法 まず、この問題のポイントを抑える 問題のポイント 右と下にのみ移動可能なマス目の経路数の数え上げ 縦マスH, 横マスWはそれぞれ、1≦H,W≦100,000 (105) AB…

フェルマーの小定理を用いてコンビネーションを計算する

背景 nCk nCkを計算したい。(n個の中からkこ取り出す組み合わせ) nCkはnCk = n! / k! * (n - k)!となる。これを計算すれば求まる。しかし、分母のk! * (n - k)!の部分に着目した時に、nの値が大きいと値が大きすぎて計算できない。 そこで、プロコンの世界で…

大ジャンプ AtCoder ABC 011D

問題 D: 大ジャンプ - AtCoder Beginner Contest 011 | AtCoder 解き方(満点解法) 以下のステップで解くことができる。 左右に移動する回数と上下に移動する回数の2パターンについて考える 左右に移動する回数をhorizon回と固定する すると上下に移動する回…

パスカルの三角形を用いてコンビネーション(組み合わせ)のクラスを実装する

コンビネーション(組み合わせ)とは nCk = n! / k! * (n - k)! n個の中からk個取り出す場合の数を算出するものである。 パスカルの三角形とは 2項展開における係数を三角形状に並べたものである。 パスカルの三角形 - Wikipedia それぞれの値はnCkの計算結果…

動的計画法が困難なナップザック問題

問題 D: ナップサック問題 - AtCoder Beginner Contest 032 | AtCoder 解法 この問題はナップザック問題を応用したものである。入力値は以下の3つの条件のどれかが当てはまる N <= 30 のケース それぞれの荷物の価値Viが1000以下のケース それぞれの荷物の…

動的計画法を使うことでアスレチックで遊ぶ時に体力の消耗を抑える

問題 C: 柱柱柱柱柱 - AtCoder Beginner Contest 040 | AtCoder 解き方 全探索では計算量がO(2n)となり間に合わない。よって動的計画法を用いて解く。 なぜ動的計画法が使えるか 部分問題を解き、その計算結果を保存し再利用することで全体の問題が解ける。i…

動的計画法を使ってグリッドの経路数を求める

問題 C: 経路 - AtCoder Beginner Contest 034 | AtCoder 100点解法 ※この問題は101点満点なので、満点解法ではない。 動的計画法を用いて経路数を算出する。 動的計画法を用いることができるのは以下の2つのポイントをおさえているから。 分割統治法: 部分…

ワーシャル・フロイド法を使って全点間の最短距離を算出する(グラフ理論)

問題 C: Blue Bird - AtCoder Beginner Contest 022 | AtCoder ソースコード 解説 AtCoder Beginner Contest 022 解説 ダイクストラ法で解けそうであるが、頂点Aから、どこかにいき再び頂点Aに戻ってくる経路は閉路なためそのままではダイクストラ法やワーシ…

最短経路DAGを作って経路の数え上げをする(動的計画法)

問題 C: 正直者の高橋くん - AtCoder Beginner Contest 021 | AtCoder ソースコード一部 ソースコードの全体は最後に添付。 解説 今回の問題では、スタートからゴールまでの最短経路が複数存在し、その経路数を求める問題である。 よって、初めに行うことは…

漸化式を用いた動的計画法の関数の作り方

わんちゃんかわいいですね。 動的計画法勉強中で流れを掴むために関数の作り方を整理します。そのため間違った内容などもあるかもですがまとめてみます。 もし、間違っていたらコメントください。 動的計画法とは 動的計画法は以下の2種類の条件を満たすア…

食費を節約するために動的計画法を用いる

問題 C: 節制 - AtCoder Beginner Contest 013 | AtCoder はじめ、高橋君の満腹度は H です。N 日間のそれぞれの日について、その日にとる食事を次の 3 種類の中から 1 つ選びます。 普通の食事: A 円の出費をして、満腹度が B 増える。 質素な食事: C 円の…

フィボナッチ数列を例にして動的計画法を学ぶ

動的計画法とは Wiki 下記2条件を満たすアルゴリズム 1. 部分問題を解き、その結果を利用して、全体問題を解く 2. 部分問題の計算結果を再利用する らしいです。 動的計画法 - Wikipedia フィボナッチ数列を例にする フィボナッチ数列が良く動的計画法を説…

美味しいたこ焼きの焼き方 AtCoder ABC 005 D

問題 D: おいしいたこ焼きの焼き方 - AtCoder Beginner Contest 005 | AtCoder ソースコード 解説 AtCoder Beginner Contest 005 解説 from AtCoder Inc. www.slideshare.net AtCoderより こちらを参考に。 実装の流れ 1. ある点から始点(1, 1)までの範囲の…