再帰関数を用いた深さ優先探索(DFS)による全探索アルゴリズム
forループを用いた全探索などは比較的簡単な内容なので直感的にもわかりやすいですが、簡単なものしか全探索できません。
複雑な条件や構造を持つものを全探索したい場合には、再帰関数を用いた深さ優先探索(DFS)を用いる必要があ ...
ランレングス圧縮と復元
ランレングス圧縮(ランレングス符号化)とは、データの圧縮方法の一つで、圧縮前に正確に復元することができる可逆圧縮の一種です。
同じ文字が連続して何文字出現するかに変換します。
例:
In: aaal ...
重みが最小となる閉路を求めるアルゴリズム
最小コストの閉路:
任意の辺 e = (u,v) について以下を繰り返すグラフ G から e を取り除くv から u への最短経路 d を求める(ダイクストラ/BFS など)
d+cost(u, ...
F – Division or Substraction 解説 (AtCoder Beginner Contest 161)
問題へのリンク
問題概要\(N\) が \(K\) 未満になるまで以下の操作を繰り返す時、最終的に 1 になるような \(K\) が何通り存在するか答えよ。
\(N\) が \(K\) で割り切れる:\(N\) を ...E – Yutori 解説 (AtCoder Beginner Contest 161)
問題へのリンク
問題概要N日間のうちK日働く。
一日働いたら、直後のC日間働けないi+1 日目は、Sの i 文字目が ‘o’ の時だけ働ける
必ず働く日を全て求めよ。 ...
D – Lunlun Number 解説 (AtCoder Beginner Contest 161)
問題へのリンク
問題概要桁ごとに見た時、隣り合う数字の差の絶対値が 1 以下になる数を考える。小さいほうから K 番目の数を求めよ
制約\(1 \leq K \leq 10^5\)考え方
制約が結構重要で ...
木DPと全方位木DPを基礎から抽象化まで解説【競技プログラミング】
競技プログラミングでよく出題される木DPについての説明と、木DPで解ける一部の問題を同じ計算量で全頂点について求められるように応用した全方位木DPについて解説します。
木DP基本的な考え方とイメージ木DP とは、根を一つ固 ...
N – 木 解説(AtCoder Typical DP Contest)
問題へのリンク
問題概要木が与えられる。辺が常に連結になるように木を描く。何通りの描き方があるか、mod 1,000,000,007 で求めよ。
制約\(2 \leq N \leq 1000 \)考え方前提: ...
ワーシャル・フロイド法での全点対最短経路を求めるアルゴリズム
任意の2頂点間の最短距離を求める問題を全点対最短経路問題といいます。
ワーシャル・フロイド法は、動的計画法を用いて全点対最短経路を求める有名なアルゴリズムです。
負の辺が含まれていても動作する負の閉路がある場 ...
トライ木(Trie木) の解説と実装【接頭辞(prefix) を利用したデータ構造】
Trie木は、効率的な検索(retrieval)のために使われるデータ構造です。文字列などの先頭部分(接頭辞: prefix)の共通部分を共有して保存することで、\(O(M)\) での検索を可能にします。(文字列の長さを\(M\) と ...