マツシタのお勉強

全探索

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

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

幅優先探索を用いてリモコン操作を最小限に抑える

問題 B: リモコン - AtCoder Regular Contest 001 | AtCoder 解き方 貪欲法でも解けるが、境界線を考慮するのが面倒。そんな時は幅優先を使って全列挙してしまう。 幅優先探索とは 幅優先探索とは、複数の選択肢がある時に、全ての選択肢を順番に試していく…

bit操作と深さ優先探索の全列挙を比較する

問題 http://abc045.contest.atcoder.jp/tasks/arc061_a 解き方 全列挙できるか 全ての数字と数字の間に対して、「+」を入れる場合と入れない場合で全列挙。文字列の長さがNの場合、「+」を入れることができる箇所は全部で(N - 1)個。それぞれの箇所に「+」…

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

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

シンプルな再帰処理による全列挙

問題 C: Brute-force Attack - AtCoder Beginner Contest 029 | AtCoder 解法 問題のタイトル通り虱潰しに出していく。Nの最大値が小さいのでfor文を何重にも書いても良いが、再帰関数を用いて書いてみる。 再帰処理を書くポイント 再帰処理を書く場合以下の…

深さ優先探索を用いて社長のお給料を決める

問題 C: 高橋君の給料 - AtCoder Beginner Contest 026 | AtCoder 解き方 問題の入力値から、上司と部下の関係をグラフを起こす。すると、今回の問題では部下に対する上司の人数は必ず1人なので木構造になる。 根ノードは社長になり、葉ノードは部下を持た…

ダイクストラ法を用いて最短経路で目的地に着く

問題 C: 壁抜け - AtCoder Beginner Contest 020 | AtCoder ソースコード 解説 問題文のxの値を固定し、xが最大となるものを出力する。xが取りうる値の最大値から順番に試し、スタートからゴールまで制限時間内にたどり着けたものを採用する。 まずは全探索…

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

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

スタートからゴールまで最短距離で辿り着く(幅優先探索)

問題 C: 幅優先探索 - AtCoder Beginner Contest 007 | AtCoder ソースコード 解説 問題文に書いてある通り、キューを用いた幅優先探索によって最短経路を算出する。 ポイント1 幅優先探索の流れ 初めにキューに入れるノード(start)の初期化 startを訪問済…

初めてのビット操作を使った全探索

問題 (AtCoder ABC002 D) abc002.contest.atcoder.jp ソースコード 解説 ビット操作により全探索をする。この問題はNの数が最大でも12なので、最大でも212 = 4096通り。 候補に対して、その要素を含むか否かの2パターンを12要素分行う。 その際、その要素を…