桁DPの基礎と応用

桁DPとは何か? 桁DP(Digit Dynamic Programming)は、通常ある区間[L, R]内で特定の制約を満たす数字の数を統計するために使用されます。LとRのデータ範囲が大きいため、DP(動的計画法)で統計する必要があることが多いです。 上限Rの処理テクニック 数値の比較ルールから、現在の桁の取りうる値の範囲は、前方の桁の値に依存することがわかります。 もし前方のすべて ...

6月25日 20:48 投稿

Codeforces 近況コンテストにおける高度なアルゴリズム技法と実装パターン

区間交差関係に基づく最小全域木構築 与えられた区間集合において、交差する区間同士を結ぶ辺の重みを権重の差とし、生成されるグラフの最小全域木を求める問題。辺を全列挙すると計算量が爆発するため、幾何学的性質と貪欲戦略を組み合わせる。権重が小さい区間から順にアクティブな集合に追加し、各区間の挿入・削除タイミング(スライン法)において、権重でソートされ ...

6月24日 18:37 投稿

USACO問題「Cow Exhibition」の動的計画法による解法

問題概要 n 個の要素があり、それぞれに整数値の属性 a と b が割り当てられています。いくつかの要素を選択して、選ばれた要素の a 属性の合計 と b 属性の合計 の総和を最大化したいと考えます。ただし、以下の条件を満たす必要があります: a 属性の合計 ≥ 0 b 属性の合計 ≥ 0 この条件下で、(aの合計) + (bの合計) を最大にするプログラムを作成します。 アプロ ...

6月23日 20:37 投稿

プログラミング問題解法集

可能な限り簡潔にします。 CF679E 直接代入と修正のタイミングが正しいことがわかりますので、書き方について説明します。区間を良い数に変える操作を「加算」と呼びます。 既に区間代入が行われた区間にUpというマークを付けると、その区間とその子区間は1つの点と見なせます。そのため、修正の複雑さは単点修正と同じになります。 したがって、加算操作は次のように記述 ...

6月21日 23:23 投稿

動的計画法による最長共通部分列と最大部分和の解法

718. 最長共通部分配列の探索 2つの整数配列が与えられた場合、最長の共通部分配列の長さを求める問題です。部分配列は連続する要素から構成され、相対的な順序を保持する必要があります。 例: 入力: 配列A: [5, 8, 3, 7, 9] 配列B: [3, 7, 9, 4, 6] 出力:3 説明:最長共通部分配列は[3, 7, 9] 解法アプローチ 2次元DPテーブルを使用します。cache[i][j]は、配列Aの0~i ...

6月21日 16:32 投稿

競技プログラミングコンテスト問題解説:Codeforces Round 521 (Div. 3)

A. カエルのジャンプ 問題の条件に従って直接シミュレーションを行います。データ範囲に注意し、long long型を使用します。 void solve(){ long long a, b, k; cin >> a >> b >> k; cout n; vector<int> arr(n); for(int i = 0; i < n; i++) cin >> arr[i]; int result = 0; for(int i = 0; i < n - 2; i++){ if(arr[i] = ...

6月19日 23:58 投稿

グラフ理論と行列操作アルゴリズム

100. 島の最大面積 与えられた1(陸地)と0(水)からなる行列において、島の最大面積を計算します。島は水平または垂直方向に隣接する陸地で構成され、周囲が水で囲まれているものとします。 from collections import deque def max_area_of_island(grid): rows, cols = len(grid), len(grid[0]) max_area = 0 for i in range(rows): for j in ...

6月18日 17:18 投稿

動的計画法の基礎と実践 : フィボナッチ数、登り方問題、コスト最小化登り方問題

動的計画法(Dynamic Programming, DP)は、問題に多数の重複する部分問題がある場合に効果的な手法です。DPの各状態は前の状態から導き出されます。これは貪欲法とは異なり、貪欲法は部分的な最適解を選択します。 解法ステップ dp配列(またはdpテーブル)とそのインデックスの意味を決定する。 再帰式(または推移式)を決定する。 dp配列の初期化を行う。 探索順序を ...

6月17日 23:36 投稿

傾き最適化DP:Luogu P2365とSDOI2012タスクスケジューリング問題の解法

問題文 動的計画法の問題を考察します。便宜上、問題文中の費用係数を\\(v_i\\)で表現します。 \\(f_i\\)を第\\(i\\�\\)位置までの最適解と定義します。各遷移は、\\(i\\)番目に区間\\([j+1,i]\\)のコストを追加する操作です。 明らかに、累和を用いて最適化できます。しかし\\(s\\)の存在により、直接次元を追加してグループ数を記録すると大きなオーバーヘッドが発生し ...

6月17日 17:27 投稿

文字列の最適削除と辞書順最小化アルゴリズム

各位置 i の文字を c[i] とし、canErase[x][y] を「文字 x が直後の文字 y を削除可能か」を表すブール配列とする。maxReach[i] は、位置 i から連続して削除可能な最大範囲の終端インデックスを示す(つまり、i+1 から maxReach[i] までの文字はすべて削除可能で、maxReach[i]+1 は削除不可能)。 貪欲戦略として、ある文字が自身の後続文字を削除でき、かつ自身も他の文 ...

6月11日 23:52 投稿