プログラミング

 Computer >> コンピューター >  >> プログラミング >> プログラミング
  1. グリッド上で目的地に到達するために必要な最小の初期ポイント|動的計画法による解法

    あるグリッドの左上のマスからスタートし、右下のマス(ゴール)へ到達することを考えます。グリッドの各マスには整数が書かれており、その値は正の場合も負の場合もあります。人物がマス (i, j) に到達すると、所持しているトークンの数はそのマスに書かれた値の分だけ増加または減少します。本記事では、この旅を完遂するために必要な初期トークンの最小値を求めるアルゴリズムを解説します。ルール移動できるのは右方向または下方向のみです。所持トークンの合計がマス (i, j) の値より少ない場合、そのマスに入ることはできません。ゴールには最小限の正のポイントを持った状態で到達しなければなりません。入力と出力入力:

  2. フロイド・ワーシャル法(Floyd–Warshall)とは?全ペア最短経路を求めるアルゴリズムを解説

    フロイド・ワーシャル法(Floyd–Warshall algorithm)は、重み付きグラフに対する「全ペア最短経路問題」を解くための代表的なアルゴリズムです。グラフ上のすべての頂点の組み合わせについて最短距離を一括で求め、その結果を「任意のノードから他のすべてのノードへの最小距離」を表す行列(距離行列)として出力します。 アルゴリズムの基本的な考え方 処理の流れは非常にシンプルです。 初期化: 出力用の行列を、グラフのコスト行列(隣接行列)と同じものにします。直接つながっていない頂点間の距離は ∞(無限大)として扱います。 更新: 各頂点 k を「中継地点」として仮定し、「i → k →

  3. フィボナッチ数列を生成する方法|動的計画法によるC++実装を解説

    フィボナッチ数列とは フィボナッチ数列は、以下のように各項が直前の2つの項の和となる数列です。 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,…… この数列では、第n項が(n-1)番目の項と(n-2)番目の項の合計として定義されます。 フィボナッチ数列の生成には再帰的なアプローチも利用できますが、動的計画法(DP)を使えば手順はさらにシンプルになります。計算済みのフィボナッチ数をすべて表(配列)に格納しておき、その表を参照することで、以降の項を効率よく求められるのがポイントです。 入力と出力 入力: 項数を入力として受け取る。例:10 出力: Enter numbe

  4. 4つのキー(A・C・V・Ctrl)だけで最大数の「A」を出力する方法

    問題の概要キーボードを使って文字「A」を入力することを考えてみましょう。使用できるのは「A」「C」「V」「Ctrl」の4つのキーだけで、決められた回数のキー操作(キーストローク)で、テキストフィールドにできるだけ多くの「A」を表示することが目標です。最大数の「A」を得るためには、次の操作を組み合わせて利用します。Ctrl + A:すべてを選択Ctrl + C:コピーCtrl + V:貼り付け入力と出力入力: キーストローク数(例: 7) 出力: 7回のキーストロークで作れる「A」の最大数は: 9 手順: A を3回押す → Ctrl+A → Ctrl+C → Ctrl+V → Ctrl+Vア

  5. 二分木の最大独立集合問題:動的計画法による解法とC++実装例

    独立集合とは独立集合(Independent Set)とは、二分木のノードから選んだ部分集合のうち、その部分集合に含まれるどの2つのノード間にも辺が存在しないものを指します。本記事では、与えられた要素の集合から最大の独立集合を見つける方法を解説します。つまり、要素を使って二分木を構築した場合に、互いに接続されていない要素のみからなる最大の部分集合を求めるという問題です。入力と出力入力:二分木 出力: 最大の独立集合のサイズは 5アルゴリズムlongSetSize(root)このアルゴリズムでは二分木を構築し、各ノードが「データ(data)」と「集合サイズ(setSize)」の2つの情報を保持

  6. 最大連続部分配列の総和を求めるアルゴリズム(カデインのアルゴリズム)を解説

    最大連続部分配列和とは整数型の配列が与えられたとき、その中から「連続する要素」を選び、それらの総和が最大となる組み合わせを求める問題です。この最大値を出力として返します。この問題は、動的計画法(DP)を使うことで効率的に解くことができます。配列を先頭から順に走査しながら「現在の位置で終わる部分配列の最大和」を記録していくことで、各時点における連続する要素の最大合計を求められます。これは一般にカデインのアルゴリズム(Kadanes Algorithm)として知られる手法です。入力と出力の例入力:整数の配列 {-2, -3, 4, -1, -2, 1, 5, -3}出力:Maximum Sum o

  7. 最長共通部分列(LCS)とは?動的計画法による解法をC++サンプル付きで解説

    最長共通部分列(LCS)とは 最長共通部分列(Longest Common Subsequence:LCS)とは、与えられた2つの文字列や配列のどちらにも共通して現れる部分列の中で、最も長いものを指します。 この問題を単純な全探索で解こうとすると、同じ部分問題が何度も繰り返し計算されてしまいます。そこで役立つのが、動的計画法(Dynamic Programming)の「部分問題の重複(Overlapping Substructure)」という性質です。一度計算した部分問題の結果を表(テーブル)に保存しておけば、あとは以前の結果を参照しながら次の結果を順に求めていくだけでよく、計算の手間を大幅に

  8. 最長ビトニック部分列の求め方:LISとLDSを組み合わせた動的計画法アルゴリズム

    最長ビトニック部分列とは「ビトニック列(bitonic sequence)」とは、最初は単調に増加し、その後単調に減少する性質を持つ数列のことです。本問題では、正の整数からなる配列が与えられ、その中から「まず増加し、次に減少する」部分列(ビトニック部分列)のうち最も長いものの長さを求めます。この問題を解くためには、次の2つの配列を定義します。最長増加部分列(LIS: Longest Increasing Subsequence):各位置 i について、array[i] を終端とする増加部分列の最大長を記録します。最長減少部分列(LDS: Longest Decreasing Subsequen

  9. 指定された開始文字から辿る最長の連続パスを求めるアルゴリズム

    異なる文字が格納された行列が与えられます。指定した一つの文字を起点として、現在の文字より「1つ大きい」連続する文字を順にたどりながら、最長のパスの長さを求めるのが本問題の目的です。最長パスを探索するには深さ優先探索(DFS)が有効です。ただし、DFS をそのまま実行すると、同じ部分問題が何度も再計算されてしまう可能性があります。そこで動的計画法(メモ化)を併用し、一度計算した結果を保存して再利用することで、無駄な計算を省き効率化します。入力と出力Input: 上図のような文字行列と開始点を与えます。ここでは開始点を e とします。 Output: Enter Starting Point (a

  10. 最長増加部分列(LIS)とは?動的計画法による求め方をC++で解説

    最長増加部分列(Longest Increasing Subsequence、略称 LIS)とは、数列の中から一部の要素を選び出し、「選んだ要素が常にその直前の要素よりも大きい」という条件を満たす部分列のうち、最も長いものを指します。この記事では、整数の集合が与えられたときに、最長増加部分列の長さを求めるアルゴリズムを解説します。 入力と出力 入力: 整数の集合 {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15} 出力: 最長増加部分列の長さ → この場合は 6 該当する部分列は 0, 2, 6, 9, 13, 15 アルゴリズム 使用

  11. 最長回文部分文字列の求め方|動的計画法によるアルゴリズムとC++実装

    文字列処理の古典的な問題のひとつに、「与えられた文字列の中から、回文となっている部分文字列のうち最も長いものを見つける」という最長回文部分文字列問題があります。この問題を解くためには多くの部分問題を処理する必要があり、その中には互いに重複する(オーバーラップする)部分問題も含まれます。同じ計算を何度も繰り返すのは非効率なため、ここでは動的計画法(Dynamic Programming)が有効です。表(テーブル)にすでに求めた部分問題の結果を記録しておけば、それを再利用しながら後続の結果を効率的に導き出せるのです。入力と出力入力: 文字列。例: thisispalapsiti 出力: 最長の回

  12. 2つの経路探索でグリッドから最大ポイントを収集するアルゴリズム

    各セルにポイントが割り当てられた行列があります。このグリッドから2つの経路探索(トラバーサル)を用いて、収集できるポイントの最大値を求める方法を解説します。 問題の条件 1回目の経路はグリッドの左上のセルからスタートし、左下の角を目指して進みます。2回目の経路は右上の角からスタートし、右下の角を目指して進みます。 あるセルから移動できるのは、真下・左下・右下のいずれかのセルのみです。 片方の経路ですでにポイントを獲得したセルからは、もう片方の経路ではポイントを獲得できません(同じセルを2重に数えることはできません)。 入力と出力 入力: ポイントが割り当てられたグリッド 3 6 8 2

  13. 1からnまでのすべての数値の桁の合計を計算するアルゴリズム

    この記事では、1からnまでの範囲に含まれるすべての整数について、それぞれの桁の合計を求め、その総和を計算するアルゴリズムを解説します。例えば、54という数値の桁の合計は 5 + 4 = 9 です。このように、範囲内のすべての数値に対して桁の合計を求め、それらを足し合わせる必要があります。ここで重要なのは、d桁の数値は全部で 10d - 1 個存在するという事実です。これらのd桁の数値すべての桁の合計を求めるには、次のような再帰的な漸化式(漸化関係)を利用できます。sum(10d − 1) = sum(10d−1 − 1) × 10 + 45 × (10d−1)入力と出力入力: このアルゴリズム

  14. 連続する1を含まない2進数文字列の個数を求めるアルゴリズム

    問題の概要 この問題では、「1」が連続して現れない2進数(バイナリ文字列)の個数を求めます。たとえば3桁の2進数文字列を考えてみると、011・110・111 の3つは連続する1を含むため対象外となり、条件を満たすのは残りの5つです。したがって、このアルゴリズムを3桁の2進数に適用した場合の答えは 5 になります。 解法のポイント:漸化式で考える a[i] を「桁数が i で、連続する1を含まない2進数の集合」、b[i] を「桁数が i で、連続する1を含む2進数の集合」と定義すると、次のような漸化式が成り立ちます。 a[i] := a[i - 1] + b[i - 1] b[i] := a[i

  15. 動的計画法でゲームの目標スコアに到達する方法の数を数える方法

    問題の概要プレイヤーが1回のムーブごとに3、5、または10のいずれかのスコアを獲得できるゲームを考えてみましょう。ここに目標スコアが与えられ、その目標に到達する方法が何通りあるかを求めるのが課題です。この問題は動的計画法(DP)を使うことで効率的に解けます。0からnまでの各スコアに対応するテーブルを用意し、3、5、10のそれぞれの点数について順番にテーブルを更新していきます。入力と出力入力: 3、5、10を使って到達すべき最大スコア。ここでは入力を50とします。 出力: (3, 5, 10)を使って50に到達する方法の数: 14アルゴリズム到達可能なスコアは3、5、10の3種類のみです。入力

  16. 道路の両側に建物を建設する方法の総数を求めるアルゴリズム

    道路に沿って n 個の区画が与えられ、各区画では道路の両側に建物を建設できるものとします。ただし、隣り合う建物同士の間には最低でも1つの空きスペースが必要です。この条件を満たすとき、建物を建設する方法は全部で何通りあるかを求めるのが本記事のテーマです。 建物の建設パターン 各区画において、建物の建設には次の4つの選択肢があります。 道路の片側だけに建設する 道路の反対側だけに建設する 建物を一切建設しない 道路の両側に建設する 入力と出力 Input: 区画の数を入力します。ここでは 3 とします。 Output: Enter Number of sections: 3 Buildin

  17. n段目の階段に到達する方法の数を求めるアルゴリズム

    問題の概要 n段の階段があり、ある人は1段目からn段目まで登ろうとしています。一度に登れる最大段数も与えられているものとします。これらの情報をもとに、n段目の階段に到達する方法が何通りあるかを求めるのがこの問題です。 たとえば、一度に最大2段まで登れる場合を考えてみましょう。この問題は再帰的な関係(漸化式)を使って解くことができます。n段目に到達するには、(n-1)段目から1段登るか、(n-2)段目から2段登るかのいずれかしかありません。したがって、次の漸化式が成り立ちます。 ways(n) = ways(n-1) + ways(n-2) これは有名なフィボナッチ数列と同じ構造です。実際、一度

  18. 卵落としパズルとは?動的計画法で最小試行回数を求めるアルゴリズムを解説

    「卵落としパズル」は、アルゴリズム学習において非常に有名な古典的な問題です。n階建ての建物とm個の卵が与えられたとき、「卵を割らずに落とすことができる安全な階(臨界階)」を見つけるために必要な最小の落下試行回数を求める、というものです。問題の前提条件この問題を解くにあたって、以下の重要なポイントを押さえておく必要があります。ある階から卵を落として割れなかった場合、それより低い階から落としても割れることはありません。ある階から卵を落として割れた場合、それより高いすべての階から落とした場合にも必ず割れます。割れた卵は廃棄しなければなりません。無事だった卵は再度使用できます。つまり、卵の耐久性には明

  19. 編集距離(レーベンシュタイン距離)とは?C++での再帰的実装をわかりやすく解説

    編集距離とは 2つの文字列が与えられたとき、1つ目の文字列(初期文字列)を2つ目の文字列(最終文字列)へ変換するために必要な最小の編集回数を求める問題を、編集距離(エディットディスタンス)と呼びます。本記事では、この問題を再帰的なアルゴリズムで解く考え方と、C++による実装例を紹介します。 ここで許される「編集」操作は、次の3種類です。 挿入 … 文字を1つ追加する 削除 … 文字を1つ取り除く 置換 … 既存の文字を別の文字に書き換える 入力と出力 比較対象となる2つの文字列を入力とし、変換に必要な編集回数を出力します。 入力: 比較する2つの文字列 string 1: Programm

  20. 各桁の合計が指定した値と等しい数の個数を求めるアルゴリズム

    概要 n 桁の整数のうち、各桁の数字の合計が指定された値と一致するものがいくつ存在するかを求める問題です。ここでは「0 は桁として数えない」、すなわち数の先頭を 0 にできないというルールが適用されます。たとえば 3 桁の数であれば、百の位には 1〜9 のいずれかの数字しか使えません。 制約は次のとおりです。 桁数 n:1 以上 100 以下 合計値:1 以上 500 以下 入力と出力 入力: アルゴリズムは桁数と合計値を受け取ります。 ここでは、桁数を 3、合計を 15 とします。 出力: 各桁の合計が 15 となる異なる 3 桁の数の個数を表示します。 結果は 69 です(合計が 1

Total 1480 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:67/74  20-コンピューター/Page Goto:1 61 62 63 64 65 66 67 68 69 70 71 72 73