LC アルゴリズムの質問: 動的計画法 dp

  1. 美しい配置
    1 から N までの整数が N 個あるとします。これらの N 個の数値から配列が正常に構築され、配列の i 番目のビット (1 <= i <= N) が次の 2 つの条件のいずれかを満たした場合、この配列を美しい配列と呼びます。状態:

i 番目の位置の数は i で割り切れます
i は i 番目の位置の数字で割り切れます
整数 N が与えられた場合、いくつの美しい配置を構築できるでしょうか?

方法 1: ステータス dp

  1. 境界外のパスの数
  2. サイズ mxn のグリッドとボールが与えられます。ボールの開始座標は [startRow, startColumn] です。ボールを隣接するセルに 4 方向に移動できます (グリッドの境界を越えてグリッドの外側に到達することもできます)。maxMove 回までボールを移動できます。

5 つの整数 m、n、maxMove、startRow、および startColumn を指定すると、ボールを境界の外に移動できるパスの数を見つけて返します。

方法 1: パス dp

  1. 学生出席記録 II は
    学生の出席記録を文字列として表すことができ、各文字はその日の出席 (欠席、遅刻、出席) をマークするために使用されます。記録には次の 3 文字のみが含まれます:
    'A': 欠席、欠席
    'L': 遅刻、遅刻
    'P':
    出席 以下の 2 つの条件を同時に満たすことができれば、出席報酬を獲得できます。

学生の欠席 (「A」) は、総出席日数に基づいて厳密に 2 日未満です。
学生は連続 3 日または連続 3 日を超えて遅刻 ('L') しません。
出席レコードの長さ (回数) を表す整数 n が与えられます。レコード長が n の場合、出席報酬を受け取る可能性のあるレコード シチュエーションの数を返します。答えが大きい可能性があるため、109 + 7 を法とする結果が返されます。

## 指定された時間 (または回数) 内に目的地に到着するための最小コスト
lc787. K 駅乗り継ぎ内の最も安い航空券
lc1928. 指定された時間内に目的地に到着するための最小コスト
方法: dfs ローテーション ルール

650. キーが 2 つだけのキーボード
当初、メモ帳には文字「A」が 1 つだけありました。このメモ帳では、一度に 2 つの操作を実行できます。
すべてコピー: このメモ帳内のすべての文字をコピーします (一部の文字のみをコピーすることはできません)。
貼り付け: 最後にコピーした文字を貼り付けます。
数値 n を指定すると、メモ帳でちょうど n 個の 'A' を出力するには、最小限の操作を使用する必要があります。n 'A' を出力できる操作の最小数を返します。

629. 逆順ペアの K 個の配列
2 つの整数 n と k が与えられると、ちょうど k 個の逆順ペアを持つ 1 から n までの数値を含む異なる配列の数を見つけます。
逆順ペアの定義は次のとおりです: 配列の i 番目と j 番目の要素について、i < j かつ a[i] > a[j] の場合、それは逆順ペアであり、それ以外の場合は逆順ペアです。 、 そうではない。
答えは大きい可能性があるため、答えの値 mod 109 + 7 のみを返す必要があります。

375. 数字を推測する II
推測ゲームを行っています。ゲームのルールは次のとおりです。

1 から n までの数字を選択します。
私がどの番号を選んだか推測してください。
正しい数字を推測すると、ゲームに勝ちます。
もしあなたの推測が間違っていたら、私が選んだ数字があなたの数字より大きいか小さいかを教えますので、あなたは推測し続ける必要があります。
数字 x を推測し、推測が間違った場合は、x 額の現金を支払います。お金がなくなるとゲームに負けます。
特定の数値 n が与えられた場合、私がどの数値を選択しても、勝利を保証する最小額の現金を返します。

688. チェス盤上の騎士の確率 アイデア
: 動的計画法 f[step][i][j] は、i, j までステップを歩く確率を表します。f[step][i][j]はすべて f[step][ni][nj]/8 を 8 方向に転送することで得られます。トリック: 行と列の位置から k 歩進む確率を、チェス盤全体から行と列の位置まで k 歩歩む確率に変更します。

887. エッグドロップは
同じ卵を k 個入手し、1 階から n 階までの n 階の建物を使用できます。
0 <= f <= n を満たす床 f が存在することが知られており、f より高い階から卵を落とすと割れますが、f またはそれより低い床から卵を落とすと割れません。
各操作では、割れていない卵を任意のフロア x (1 <= x <= n を満たす) から落とすことができます。卵が割れてしまうと二度と使えません。卵を落としても割れなければ、その後の操作で再利用できます。
f の正確な値を決定するために必要な最小演算数を計算して返していただけますか。

考え方:一見2つに分けられるように見えますが、この場合kは使用しません、また、2つに分ける際に卵を割るコストは考慮しません、動的計画法が使えますこの問題では、 dp[k][n] は現在の k 個の卵と、n 階に卵を投げる最小回数を表します。
x 階に卵を投げる場合:
卵が割れなければ、状態は (k, nx) になります。つまり、卵の数は変わりませんが、答えは上の nx 階でのみ得られます。言い換えれば、元の問題をサイズ (k, nx) の部分問題に縮小しました。
卵が割れると、状態は (k−1,x−1) になり、つまり卵が 1 つ減ります。 , しかし、答えは x 階の下の x-1 階にしか存在しないことがわかっています。言い換えれば、元の問題をサイズ (k-1, x-1) の部分問題に縮小します。
dp(k,n)=1+1≤x≤nmin (max(dp(k−1,x−1),dp(k,n−x)))。
全体的な複雑さは O(k n n) であるため、現在の dp[k][n] を計算するロジックを最適化する必要があります。元々はフロアを列挙しており、まず、k が固定されている場合、dp は単調である必要があります。これは当然のことですが、上層階になるほど操作数は増加します。dp(k−1,x−1)とdp(k,n−x)(1次元目のkは無視)はどちらか一方が増加し、もう一方は減少します(xが増加すると) このとき、ほぼ次のようになります。下図のようここに画像の説明を挿入します
に、これら2つの最小値の大きい方を取ると、t1とt2の交点位置が求まります。この交差の 2 つの辺は (図に示すように) 二分法に従うため、2 つに分割できます。また、両方の関数は連続ではなく離散的であることに注意してください。たとえば、整数 1、2、および 3 のみが分割できます。取られます。したがって、交点が整数にならない場合もありますが、このとき交点に最も近いx0とx1のみで、この2点から現在のdp値を計算することができます(自明のこと)。

72. 距離の編集
2 つの単語、word1 と word2 が与えられた場合、word1 を word2 に変換するために使用される操作の最小数を返してください。
単語に対して次の 3 つの操作を実行できます:
文字の挿入、
文字の削除、
文字の置換

まず、挿入と削除は対称であるため、挿入と置換の場合のみを考慮します。したがって、 A の挿入、B の挿入、A または B の変更の
3 つの状況が存在します。dp[i][j] が A0、A1、...、Ai と B0、B1、...、Bj の編集距離を表すものとします。上記の状況を踏まえて、dp[i][j]に変換する方法を考えます。

926. 文字列を単調増加に反転する
バイナリ文字列がいくつかの 0 (おそらく 0 ではない) とそれに続くいくつかの 1 (おそらく 1 ではない) で構成されている場合、その文字列は単調増加になります。
バイナリ文字列 s を指定すると、任意の 0 を 1 に、または 1 を 0 に反転できます。
s が単調増加する最小のフリップ数を返します。

871. 最小給油回数
j 回の給油で移動できる最大距離を表すように dp[j] を定義します。dp 配列を更新した後、小さい添字から大きい添字までトラバースします。dp[i] がターゲットより大きい場合、dp[i] がターゲットより大きい場合、直接返却される。
dp 配列を更新するにはどうすればよいですか? dp[0]=startfuel は明白で、距離に従って各ガソリン スタンドを横断し、dp[i] がガソリン スタンドまでの距離より大きいかどうかに基づいて毎回 dp i を更新します

522. 最長特殊シーケンス II は
本質的に LCS のテストです。この質問では、str の 1 つが別の str のサブ str である場合、特殊な str はまったく存在しないことを最初に知る必要があります。そして、str が他の str の部分文字列でない場合、str の特別な str はそれ自体になります。これがわかっていれば、あとはダブルサイクルです。

873. 最長のフィボナッチ部分列 fibonacci の長さは
、2 つの数値によって決定されます: f[i][j]: arri は下から 1 番目の数値、arrj は下から 2 番目の数値、およびシーケンスの長さは下から2番目の番号です 3つの番号を取得して記録できます arr[i]からiまでのマップを取得し、最後から3番目の番号のインデックスを取得できます 伝達方程式は次のようになります得られた。

おすすめ

転載: blog.csdn.net/weixin_45719581/article/details/119740821
おすすめ