動的計画法:完全背包問題の主要パターンと実装ガイド

完全背包問題の基本概念 動的計画法(DP)における完全背包問題(Complete Knapsack Problem)は、各アイテムを無限に選択可能な状態での最適化問題を指します。0-1 背包問題との主な違いは、アイテムの再利用が許可されている点であり、これにより状態遷移の内側ループ順序が重要になります。具体的には、背包の容量を小さい方から大きい方へ順に更新することで、同一ア ...

7月23日 17:01 投稿

アルゴリズム問題の効率的な解法

本記事では、複数のアルゴリズム問題について考察し、それぞれの問題に対する効率的な解法を説明します。 避難所配置問題 この問題は、特定の範囲内で最も効率的な方法で避難所を配置する必要がある。具体的には、以下の関数を考える: [ g(y, r) ] は、右境界が (r) の場合に、位置 (y) に避難所を設置したときのコストを表す。 我々が必要とするのは、[ \max_{j \geq mid ...

7月18日 01:21 投稿

UKIEPC 2017 プログラミングコンテスト問題解説

Problem A: Alien Sunset 各惑星の自転周期、日の出時刻、日の入り時刻を格納します。自転周期の最大値(max_period)を求め、0からmax_period×1825までの時間を列挙します。各時間について全ての惑星で夜間であることを確認し、条件を満たす最初の時刻を出力します。 #include <bits/stdc++.h> using namespace std; struct Planet { int period, sunrise, sunse ...

7月15日 16:15 投稿

JOI 2013 国内予選最終ラウンド解説

問題1:交互配列の最長連結区間 与えられた 0-1 列において、隣接要素が交互に変化する(例:01010)最大長の連続部分列を求める。ただし、1つの「交互セグメント」を反転することで、より長い連続交互列を得られる可能性がある。 まず、入力列を交互性に基づいて分割し、各セグメントの左右端点を記録。その後、隣接する3つのセグメント(左・中・右)を結合した長さを評 ...

7月14日 01:06 投稿

Codeforces 909 問題A〜Fの解説

Codeforces 909 問題解説 問題URL A B C D E F 難易度:赤 黄 緑 青 緑 紫 解説 A 問題概要:2つの文字列が与えられる。非空の接頭辞を連結した文字列の中で辞書順最小のものを求める。 アルゴリズムラベル:貪欲 解法分析: 辞書順比較は左から順に文字を比較し、どちらかが終了するか異なる文字が見つかるまで続ける。このため、貪欲法が有効。前後の文字列の接頭辞を比 ...

6月26日 19:39 投稿

競技プログラミング問題解説:貪欲法から動的計画法まで

問題 1:目標値への到達ステップ数 この問題は貪欲法の適用例です。目標値 50 に対して、現在の値が不足している場合と超過している場合で戦略が異なります。不足時には 2 で割った余り、超過時には 3 で割った余りを考慮し、必要な操作回数を計算します。 具体的には、差額が偶数であれば単純に除算し、奇数であれば調整値を加えてから計算します。超過時についても同様に ...

6月22日 23:05 投稿

障害物のある格子路の問題解法:動的最適化による経路カウント

m 行 n 列の二次元グリッドが与えられた場合、左上隅の座標から右下隅の座標まで移動するシナリオを考慮します。移動ルールとして、一歩ごとに「下」または「右」へ進むことが許容されています。 この環境には障害物が混在しており、特定のセルは通ることが不可能です。データ構造上、障害物は整数 1、空席は 0 によって定義されます。これらの条件を満たしながら、スタ ...

6月17日 20:42 投稿

SMU Winter 2025 個人コンテスト第3回 解説

A. Vasya and Book 現在のページ x から目的のページ y まで、1回の操作で d ページ進むか戻る(ただし範囲外には行けない)ときの最小操作回数を求める。 以下の3通りを検討し、可能なものの最小値を取る: |x - y| が d で割り切れる場合:直接移動可能。回数は |x - y| / d。 先頭ページ(1)経由: (y - 1) % d == 0 のとき、x → 1 → y の合計回数は ceil(x / d) + (y ...

6月16日 16:57 投稿

動的計画法による配列最適化問題の解法パターン

階段登拝における最小コストの算出 配列の各要素が階段のコストを表しており、索引 i の階段を登る際に cost[i] の体力を消費します。支払い済みの場合、1 つまたは 2 つの階段を 건너갈 수 있습니다. 最上部に到達するための最小総コストを求めます。初期位置として索引 0 または 1 を選択可能です。 状態遷移としては、i 番目の階段に到達する最小コストは、i-1 番目から ...

6月12日 16:13 投稿

競技プログラミングにおける行列の実装と応用例

行列の定義と基本性質 行列(Matrix)は、数値を長方形の配列状に配置した構造体です。一般に \(m \times n\) の次元を持つ行列 \(A\) は、以下のように表されます。 $$ A = \begin{bmatrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\ a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m,1} & ...

6月7日 19:46 投稿