目次
動的プログラミングを学ぶにはどうすればよいですか?
動的プログラミングの学習はもちろん、アルゴリズムの学習にも近道はありません。
動的プログラミング アルゴリズムに関する質問を私と一緒に解決し、動的プログラミングを一緒に学びましょう!
1. トピック分析
トピックリンク: 1137. N番目のティボナッチ数 - Leetcode
トピックで指定された条件によると、次のようになります。
Tn+3 = Tn + Tn+1 + Tn + 2、つまり: Tn = Tn - 1 + Tn - 2 + Tn - 3
n 番目のタイボナッチ数は、実際には最初の 3 つの数の合計であることがわかります。
2. アルゴリズム原理
1. ステータス表現
一般的に言えば、まず dp テーブルとして配列を作成します。
この dp 表に記入すると、答えはこの表の特定の位置にあります。
状態表現の意味とは、テーブル上の値によって表現される意味である。
こうした想像上のことは言うまでもなく、どうやって国家の代表を取得するのでしょうか?
1. トピックの要件に従って
2. 私たちの経験とトピックの要件に基づく
3. 問題を分析する過程で、重複する部分問題が発見される
ただし、このトピックは比較的単純であり、トピックの要件に従って状態表現を直接取得できます。
dp[ i ] は、i 番目のタイボナッチ数を意味します。
2. 状態遷移方程式
状態遷移方程式とは何ですか?
実際には次のとおりです。
dp[ i ] は何かに等しい。
この質問は比較的単純で、状態遷移方程式の式が直接得られます。
したがって、 dp[ i ] は次と等しくなります。
dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ] + dp[ i - 3 ]
3. 初期化
初期化の機能は次のとおりです。
フォームに記入する際は、境界線を越えないよう注意してください。
そして、この質問は私たちにとっても非常に親密なものです。
彼はこう言います: T0 = 0、T1 = 1、T2 = 1、
次に、初期化する必要があるのは、dp[ 0 ] = 0、dp[ 1 ] = 1、dp[ 2 ] = 1、それだけです。
4.注文の実行
フォームに入力する順序は次のとおりです。現在の状態を入力するとき、必要な状態はすでに計算されています。
したがって、この質問に記入する順序は左から右になります。
5. 戻り値
実際、戻り値は質問で必要な値を返します。この質問が返すものは次のとおりです: dp[ n ]
3. コードの書き方
まずトピックのインターフェースを見てください。
class Solution {
public:
int tribonacci(int n) {
}
};
アルゴリズムの原理を学んだ順序でコードを書いてみましょう。
class Solution {
public:
int tribonacci(int n) {
// 1. 创建 dp 表
// 2. 初始化
// 3. 填表
// 4. 返回值
// 处理边界问题
if(n == 0) return 0;
if(n == 1 || n == 2) return 1;
vector<int> dp(n + 1);
dp[0] = 0, dp[1] = 1, dp[2] = 1;
for(int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
}
return dp[n];
}
};
私たちの 4 つのステップに従って、境界問題に対処し、それを解決しました。
4. スペースの最適化
私たちが最初に動的プログラミングを学び始めたとき、最も重要なことは、この問題をどのように解決するかということでした。
最適化する方法を考える代わりに、これについては後で説明しませんが、
ここで、この質問の単純さを利用して、この質問を最適化して、この質問をいじめてみましょう。
一般に、動的プログラミングの空間最適化は、ローリング配列によって最適化されます。
dp テーブルに記入するときは、最初のいくつかの状態のみを使用する必要があり、他の状態が必要なくなったら、
次に、ローリング配列を使用して最適化できます。
class Solution {
public:
int tribonacci(int n) {
//空间优化
// 处理边界问题
if(n == 0) return 0;
if(n == 1 || n == 2) return 1;
int a = 0, b = 1, c = 1, d = 0;
for(int i = 3; i <= n; i++) {
d = a + b + c;
//滚动操作:
a = b; b = c; c = d;
}
return d;
}
};
このようにして、スペース消費量は O(N) から O(1) に変化します。
最後に次のように書きます。
以上が今回の記事の内容となります、読んでいただきありがとうございます。
何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。
記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜