ブラシフィンガーオファーとLeetCodeでは、動的計画法が頻繁に発生するタイプの問題であることがわかりました。次に、ルーチンを注意深く分析して要約します。
前書き
簡単に言えば、動的計画法(DP)は、実際には最適解を解く方法であり、特別な分割統治法のアイデアであり、主に状態遷移に従って解かれる時間計算量を最適化するために使用できます。方程式。
そこに含まれる2つの主要なアイデアは、分割統治法と貪欲法です。
問題解決のアイデア
一般的に、動的計画法の問題を解決するには、次の4つのステップがあります。
- 状態表現
- 伝達方程式
- 初期状態
- 最終状態
これらの4つのステップを詳しく説明しましょう。最初に、通常は配列を使用してデータを格納するテーブルを作成し、問題を分析して既存の状態遷移方程式を見つける必要があります。つまり、前の状態から次の状態へです。状態。どのように変化しますか?次に、タイトルに応じて初期値を設定し、状態遷移式に従って計算を繰り返します。このプロセスでは、以前に蓄積されたレコードが使用されるため、速度を上げることができます。最後に、必要な最終状態を探しています。
実際のテスト演習
このアルゴリズムのアイデアを誰もが理解できるようにするための例として、オファーの質問47の典型的な質問であるギフトの最大値を取り上げましょう。
連続するサブアレイの最大合計
トピック:
m * nチェス盤の各正方形にギフトが置かれ、各ギフトには特定の値(0より大きい値)があります。ボードの左上隅から始めて、グリッド内のギフトを取得し、ボードの右下隅に到達するまで、一度に1マスずつ右または下に移動できます。チェス盤とその上の贈り物の価値を考慮して、あなたが得ることができる贈り物の最大値を計算してください?
解決
この記事が言ったことは、動的計画法を説明することは間違いなく動的計画法を使用してこの問題を解決することです。次に、手順に従います
- 状態表現
動的計画法行列dp [] []を想定します。ここで、dp [i] [j]は、ボードの左上隅からセル(i、j)まで取得できるギフトの最大累積値を表します。
- 伝達方程式
右または下にしか移動できないため、次のようになります。
-
- i = 0およびj = 0の場合、それは開始要素です
- i = 0およびj≠0の場合、これは最初の行要素であり、左側でのみ到達できます。
- i≠0かつj = 0の場合、これは最初の列の要素であり、上からのみ到達できます。
- i≠0でjが0に等しくない場合、上または左から到達できます。
したがって、状態遷移方程式は次のようになります。
- 初期状態
上記の分析から、dp [0] [0] = grid [0] [0]であることがわかります。
- 最終状態
トラバースした後の最終状態はdp [m-1] [n-1]です。dp配列の右下隅にある要素を返します
Javaの実装
その背後にある考え方は、以下に示すように、Javaの実現です。
class Solution {
public int maxValue(int[][] grid) {
int row = grid.length;
int column = grid[0].length;
//dp[i][j]表示从grid[0][0]到grid[i - 1][j - 1]时的最大价值
int[][] dp = new int[row + 1][column + 1];
for (int i = 1; i <= row; i++) {
for (int j = 1; j <= column; j++) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
}
}
return dp[row][column];
}
}
総括する
これらはすべて動的計画法の内容であり、LeetCodeやインタビューによく登場するトピックとして、習得する必要があると言えます。要するに、それは4つのことに焦点を当てることです:
- 状態表現
- 伝達方程式
- 初期状態
- 最終状態
最も難しいのは伝達方程式です。これはトピックごとに柔軟に処理する必要があります。そうしないと、トピックの要約をさらに行うことで、良い結果と進歩を得ることができます。状態遷移方程式がある限り、初期状態と境界値にもっと注意を払うことに大きな問題はありません。
やっと
- 読んでやりがいを感じたら、気をつけたいと思います。ちなみに、いいねを言ってください。これが私のアップデートの最大のモチベーションになります。ご支援ありがとうございます。
- Javaとコンピュータの基本的な知識に焦点を当てた私の公開アカウント[JavaFox]に注目してください。私を信じていない場合は、私を叩いてください。
- ワンクリックのトリプル接続を探します:いいね、転送、視聴。
- 読んだ後に異なる意見や提案がある場合は、コメントして私たちと共有してください。皆様のご支援、ご愛顧を賜りますようお願い申し上げます。
-私は竹湖です。あなたと同じくらいプログラミングが大好きです。
最新ニュースについては、パブリックアカウント「JavaFox」をフォローすることを歓迎します